我有一个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
答案 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即时生成惰性代理的支持。