2015-11-23 26 views
2

是它認爲不好的做法,有一個工廠/倉庫能夠創建/看,幾個不同類型的對象(所有這些都從一個抽象基類繼承)的?我一直無法找到任何人對此進行任何說明,但我所見過的所有工廠示例似乎都有1種類型的工廠用於需要創建的每種類型的項目。使用單個工廠/倉庫創建/查找多種類型

在我的情況,我有超過150班,從ModelBase需要從我的ViewModels動態創建的繼承。每個buisness類都有幾個服務需要依賴注入到它們的構造函數中,但我不希望我的ViewModel有權訪問這些服務。唯一的(優雅)解決方案,我能想到的是創建一個BizFactory /存儲庫,用於創建/查找,任何東西,從ModelBase繼承。所有的模型庫類必須實現一個Save()Delete(),所以它沒有必要從BizFactory辦理儲蓄...

public interface IBizFactory 
{ 
    public T GetById<T>(int id) where T:ModelBase; 
    public IList<T> GetAll<T>() where T:ModelBase; 
    public T Create<T>() where T:ModelBase; 
} 

public class BizFactory: IBizFactory 
{ 
    private IDataStoreFactory datafactory; 

    public BizFactory(IDataStoreFactory datafactory) 
    { 
     this.datafactory = datafactory; 
    } 

    ... 
} 

在進一步的反思...

我看到的時候,唯一一次遠程看起來這是...的DbContext在這種情況下,你使用相同類型的對象(你的DbContext),甚至同一個實例,查找任何使用Set<T>()方法的實體。

回答

0

擬議的shape of IBizFactory suggests that it's a Service Locator,其中is an anti-pattern,雖然有些depends on the role in which it's being used

相反,認爲像這樣的接口:

public interface IBizFactory<T> where T : ModelBase 
{ 
    public T GetById(int id); 
    public IList<T> GetAll(); 
    public T Create(); 
} 

也就是說,如果你需要的功能,這在所有。

既然你有超過150班,從ModelBase獲得,這也將表明(每個T之一)的IBizFactory<T> 150構成的情況下,所以它會使用基於約定的方法來一個DI最有可能是最容易implement it容器;基本上,讓DI Container掃描您的組件以找到所有相關的ModelBase類。 IIRC,Castle Windsor可以輕鬆做到這一點。

+0

我正確地認爲,爲了防止我的ViewModel訪問我的ModelBase子類(因此我的ModelBaseFactory)依賴的服務,我必須依賴注入一個不同的'ModelBaseFactory '爲每個我的ViewModel需要的ModelBase類型? 例如,如果我的視圖模型需要同時創建'Individual's和'Badge's,我的視圖模型將有一個構造函數,它看起來像'MyViewModel(ModelBaseFactory indFactory,ModelBaseFactory badgeFactory,...。)' – NuclearProgrammer

+0

此外,這將是確定有1個執行'IBizFactory '使用反射創建T'的'/查找實例。我寧願避免必須定義從IBizFactory ,IBizFactory 等派生的150個類。 – NuclearProgrammer

+0

不是ViewModels被動數據結構沒有行爲嗎? –