整个应用程序的MS UnityContainer配置

时间:2012-06-11 15:07:51

标签: wpf unity-container

我有一个DAL依赖的类:

public class FirstClass()
{
    [Dependency]
    public IDalType Dal { get; set; }
}

我可以用:

创建一个类的实例
UnityContainer c = new UnityContainer();  
c.RegisterType<IDalType, DalType>();
FirstClass fc = c.Resolve<FirstClass>();

这将设置依赖项,我可以使用该实例。这类似于起始主类(主窗体,主ViewModel)。

现在,我再次使用DAL依赖项SecondClass,并且必须实例化第二个类并从第一个类调用。我该怎么做?

public class FirstClass()
{
    [Dependency]
    public IDalType Dal { get; set; }

    public DoSomething()
    {
        ??? SecondClass sc = App.UnityContainer.Resolve<SecondClass>();
    }
}

如果我在第一个类中使用UnityContainer,那将是与容器的耦合,我将不得不映射IDAL - &gt; DAL在应用程序根目录的某处,并有一个静态容器。

我读到与容器的耦合不好,以及使用静态映射: http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx

2 个答案:

答案 0 :(得分:1)

添加SecondClass作为FirstClass的依赖项:

public class FirstClass
{
    [Dependency]
    public IDalType Dal { get; set; }

    [Dependency]
    public SecondClass Sc { get; set; }

    public DoSomething()
    {
        sc.DoWhatever();
    }
}

但是,我强烈建议切换到构造函数注入:

public class FirstClass
{
    private IDalType dal;
    private SecondClass sc;

    public FirstClass(IDalType dal, SecondClass sc) 
    {
        this.dal = dal;
        this.sc = sc;
    }

    public DoSomething()
    {
        sc.DoWhatever();
    }
}

这样您就不会通过属性与容器耦合,并且您不会公开仅作为输入的属性(使您的类的公共接口混乱),并且您保证无法创建FirstClass的实例没有它具有所需的所有依赖关系。

更新

如果需要按需创建实例,可以改为注入Func。 Unity将为您创建一个工厂方法,在调用时,它将回调到容器中。

public class FirstClass
{
    private IDalType dal;
    private Func<SecondClass> scFactory;

    public FirstClass(IDalType dal, Func<SecondClass> scFactory) 
    {
        this.dal = dal;
        this.scFactory = scFactory;
    }

    public DoSomething()
    {
        SecondClass cs = scFactory();
        sc.DoWhatever();
    }
}

如果你有更复杂的要求来选择哪个帮助对象做什么,我会重新评估你是否应该从容器中获取有问题的对象。相反,请考虑注入显式工厂对象。

答案 1 :(得分:1)

使用工厂将在您的消费者中提供有关服务实例化(您的SecondClass)的一些知识。在this post Mark Seemann描述了另一种方法。

如果您不想浪费时间和精力编写这些类型的适配器,请查看TecX project on CodePlex。它增加了使用Unity即时生成惰性代理的支持。