0

我非常不确定我应该如何处理这个问题,因为我是 Unity Container 的新手。

这是我拥有的一家工厂:

 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 的数据库对象上下文。

我该怎么做呢?

我应该在调用工厂的课程中这样做吗?或注入 unitycontainer 并在此时解析不同的 DB 对象上下文。

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

希望这是有道理的...... :) 提前感谢尼尔

4

3 回答 3

1

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

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

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

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

欢迎任何建议..

于 2012-11-21T15:23:27.200 回答
0

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

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

于 2014-08-18T19:09:36.230 回答
0

很高兴看到 OP 自己解决了这个问题。如果人们仍然感兴趣,我们有一个关于如何解决此类问题的广泛示例:https ://dannyvanderkraan.wordpress.com/2015/06/29/real-world-example-of-dependency-injection-based-on-运行时值/

于 2015-07-02T18:33:48.770 回答