0

鬆耦合需要一點點的幫助,請如果任何人可以在此提供一些線索。實體框架4.1的實體

我創建這是我工作的罰款代碼優先MVC 3應用程序。我現在正在重構,以儘可能多地去除耦合,因爲我希望稍後在其他各種MVC 3應用程序中使用該域模型。我現在擁有的是一組實體,它們通過規範化數據庫持久化,並通過存儲庫模式進行CRUD編輯。我已經通過控制器的構造函數使用Ninject將DI存儲到DI中,並且正在使用MVC 3項目中的模型來充當DAO。

因此,域內我有一個名爲實體案例,有一個外鍵的另一種情況客戶,看起來像這樣:

public class Case : ICase 
{ 
    [Key] 
    public int CaseId { get; set; } 
    public string CaseName { get; set; } 
    public DateTime DateCreated { get; set; } 
    public IClient Client { get; set; } 
} 

然後,我有一個接口(接口主要存在將其實現到視圖模型添加我的數據註釋 - 我知道我可以將註釋添加到域對象,但正如我所說我想要在其他應用程序中使用此域模型將具有不同的無處不在的語言。

public interface ICase 
{ 
    int CaseId { get; set; } 
    string CaseName { get; set; } 
    DateTime DateCreated { get; set; } 
    IClient Client { get; set; } 
} 

然後我在MVC 3項目中有我的視圖模型。

public class CaseModel : ICase 
{ 
    [HiddenInput(DisplayValue = false)] 
    int CaseId { get; set; } 

    [Required(AllowEmptyStrings = false)] 
    [MaxLength(100)] 
    string CaseName { get; set; } 

    [RegularExpression("")] 
    DateTime DateCreated { get; set; }  

    IClient Client { get; set; }  
} 

所以,我的第一個問題是:改變了我的外鍵引用爲客戶IClient是一個新事物,它返回一個空的對象。當類型是一個具體的類時,它返回正常 - 我假設這是因爲EF4.1試圖創建一個實例IClient。我在這裏完全錯誤還是有辦法解決這個問題?

我(可能否定我的第一個問題)第二個問題是我我也做錯了通過添加數據註解視圖模型繼承我的域實體的接口?我應該使用模型元數據嗎?如果是這樣,我該如何使用元數據,以便我可以在不觸及域的情況下使每個項目的數據註釋都是唯一的?

謝謝!

+0

只是爲了澄清爲什麼解決第二個問題可能會否定我的第一個問題。這些接口存在的唯一原因是視圖模型具有類似於域實體的結構。如果有一種更好的方法來將註釋的元數據添加到駐留在不同程序集中的域實體中,那麼這些接口不需要存在。我可以刪除它們並返回使用我的域實體的具體版本。 –

+1

您不能在實體中使用接口作爲導航引用。這就像在屬性上放置一個'[NotMapped]'屬性,EF簡單地忽略了這個屬性。你必須有一個具體的或抽象的類。僅用於集合,您可以使用像'ICollection '這樣的接口。另一方面'T'必須再次成爲一個班級,而不是一個界面。對於標準收集接口,EF具有默認規則,如何實例化它們:「ICollection - > HashSet '或'IList - > List '等。對於您定製的自定義接口,EF沒有這樣的規則,並且不知道如何實例化這些。 – Slauma

+0

順便說一下,EF現在高達4.2。 – TrueWill

回答

3

警告:我不是EF或MVC3的專家。

我們在建設EF代碼第一次實體的過程中,我們目前沒有在接口加入實體規劃。存儲庫獲取接口。工作單元獲取接口。實體不。存儲庫返回具體的實體,即POCO。實體可能會與相關實體耦合。模型和其他類通常會獲得注入庫接口和/或工作單元接口。爲了進行測試,我們只需創建一些POCO實體並從模擬存儲庫返回。

我們打算做出相關POCO性質虛擬的,這樣可以EF創建代理。

如果你想從一個具體實體中分離一個視圖,我首先會問你期望從中獲得什麼價值。該視圖是否會與不同的實體重用?如果是這樣,一種選擇是使用類似AutoMapper的東西來複制屬性。不過,你必須意識到延遲加載屬性的直接訪問。

+0

嗨,感謝您的回覆!我在原始消息中試圖傳達的是,實體的接口僅用於具有類似結構化視圖模型(其中我添加了我的應用程序指定的數據註釋)的目的。實體接口根本就不是用於解耦的目的。我想說,我的第一個問題基本上是我的錯誤。那麼我的實際問題是,我該如何爲指定的域實體(針對CRUD內容)應用程序創建數據註釋,而不是將其硬編碼到域中? –

+0

所以你說你不想把MVC HiddenInputAttribute放在實體上,對嗎?我同意這一點。我會讓他們在ViewModel上。將實體複製到ViewModel(手動或使用AutoMapper),或者將ViewModel委託給實體(可能更好)。再次,我不是模式專家 - [維基百科文章](http://en.wikipedia.org/wiki/Model_View_ViewModel)似乎使用委派。 – TrueWill

+1

如果你的意思是EF特有的屬性像MaxLength,我會說「如果我們放棄EF我們有其他問題」或使用Fluent API來配置不同的類映射。 – TrueWill