抽象工厂和统一依赖注入

时间:2012-11-21 12:34:51

标签: c# entity-framework dependency-injection unity-container enterprise-library

我非常不确定我应该如何处理它作为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容器来解析各种类型的IDataCopiers的数据库对象上下文。

我该怎么做?

我应该在打电话给工厂的班级里这样做吗?或者注入unitycontainer并在那时解析不同的DB Object Contexts。

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

希望这有道理...... :)  提前致谢 尼尔

3 个答案:

答案 0 :(得分:1)

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

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

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

这可能是最好的处理方式,因为我将repo耦合到datacopier类,但我认为它没关系,因为抽象已经存在于repo和对象上下文之间(我将objectcontext作为依赖项注入使用统一所有回购品)

欢迎任何建议..

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

很高兴看到OP自己解决了这个问题。如果人们仍然感兴趣,我们有一个广泛的例子来说明如何解决这些问题:https://dannyvanderkraan.wordpress.com/2015/06/29/real-world-example-of-dependency-injection-based-on-run-time-values/