2015-11-23 25 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被动数据结构没有行为吗? –