Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抽象工厂与统一依赖注入_C#_Entity Framework_Dependency Injection_Unity Container_Enterprise Library - Fatal编程技术网

C# 抽象工厂与统一依赖注入

C# 抽象工厂与统一依赖注入,c#,entity-framework,dependency-injection,unity-container,enterprise-library,C#,Entity Framework,Dependency Injection,Unity Container,Enterprise Library,我非常不确定我应该如何处理这个问题,因为我是Unity容器的新手 我有一家工厂: class DataCopierFactory : IDataCopierFactory { private readonly IUnityContainer _container; //not mad on binding the factory to the container, but feck it public DataCopierFactory(IUnityContainer

我非常不确定我应该如何处理这个问题,因为我是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方法并传入一些枚举时,我想使用Unity容器来解析各种IDataCopier类型的DB对象上下文

我该怎么做

我应该在调用工厂的类中这样做吗?或者注入unitycontainer并在该点解析不同的DB对象上下文

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

希望这是有意义的…:) 提前谢谢
尼尔找到了答案。。是我的错:)

我试图将objectContext作为依赖项注入,但我不应该这样做。我认为工厂不应该有你的IOC容器的实例

在使用存储库模式时,每个DataCopier impl不应该需要ObjContext的实例,因为它们都有各自需要的存储库的实例

这可能不是最好的方法,因为我将repo耦合到datacopier类,但我认为这没问题,因为repo和对象上下文之间已经存在抽象(我使用Unity将objectcontext作为依赖注入所有repo)


欢迎任何建议。

我建议为您的IDataCopier进行多个Unity注册(针对每个实现)。通过获取IDataCopier[]的构造函数参数,可以将它们全部注入工厂。注意:使用Unity时,您必须在多次注册时为每个注册命名


然后你需要一种方法来选择你想要的。我建议在IDataCopier接口中添加一个get属性,该属性可以是int或string标记。然后,您的createDataCopier(int)可以查询从Unity获得的IDataCopier[],以获取get属性==int i的元素。这是“策略模式”,比静态开关语句更灵活。将IDataCopier[]存储到字典字段中是方便选择的一种简便方法,但一个简单的LINQ语句也会起作用。

很高兴看到OP自己解决了这个问题。如果人们仍然感兴趣,我们有一个关于如何解决这些问题的广泛示例: