0

我很不确定我应该如何处理这个新的Unity容器。抽象工厂和统一依赖注入

继承人厂我有:

class DataCopierFactory : IDataCopierFactory 
{ 
    private readonly IUnityContainer _container; 
    //not mad on binding the factory to the container, but feck it 
    public DataCopierFactory(IUnityContainer container) 
    { 
    _container = container; 

    } 

    //return a data copier that will transfer data from any DB to any other DB 
    public IDataCopier createDataCopier(int i) 
    { 
     switch(i) 
     { 
      case 1: 
       return new ScheduleDataCopier(new LTEEFContext()); //somehow resolve the LTEEFContext.. 
      //case 2: 
      //  
      default: 
       throw new InvalidOperationException("Parameter -t=" + i + " does not exist"); 

     } 
    } 
} 

当我打电话的createDataCopier方法,并传递一些枚举,我想使用统一的容器来解决我的各类IDataCopiers的DB对象上下文。

我该怎么做?

我应该在班级中打电话给工厂吗?或者注入unitycontainer并在那一点解析不同的DB对象上下文。

IDatacopier的每个实现都有一个IDBContext作为构造函数,我想基本上注入它,但允许我为Datacopier的不同实现更改上下文。

希望这是有道理的... :) 在此先感谢 尼尔

回答

1

找到了答案..好是我的错:)

我试图注入ObjectContext的作为依赖时我不应该有。我不认为工厂应该有你的IOC容器的实例。

即使使用Repository模式,每个DataCopier impl都不需要ObjContext的实例,因为它们都具有它们各自所需的存储库的实例。

这可能是做事情的最佳方式,因为我将数据库耦合到数据访问类,但我认为它可以,因为抽象已经存在于数据库和对象上下文之间(我将objectcontext注入为依赖项使用Unity的所有回购的)

欢迎任何建议..

0

我建议有你IDataCopier多个统一注册(每个实现)。您可以通过采用IDataCopier []的构造函数参数将它们全部注入到工厂中。 注意:使用Unity 必须在名称的每个注册时进行乘法注册。

然后你需要一种方法来选择你想要的。我建议添加一个get属性到你的IDataCopier接口,它可以是int或字符串标签。然后,您的createDataCopier(int)可以查询您从Unity获得的IDataCopier [],其中get属性== int i。这是“战略模式”,并且比静态切换语句具有更大的灵活性。将IDataCopier []存储到字典字段中将是方便选择的便捷方式,但是简单的LINQ语句也可以。