我使用的是Unity mvc4包,它可以自动注入我的控制器。但现在我手动执行我的应用程序的其他部分,助手等。
如何从其他类访问容器中的单例?
如何在我的MyClass2实例上调用MethodWithDependency(param)?我应该做以下吗?它看起来太乱了。
public class MyClass1
{
public void Main()
{
var myObject2 = container.Resolve<MyClass2>;
var someObject = container.Resolve<SomeClass>;
myObject2.MethodWithDependency(someObject);
}
}
public class MyClass2
{
public void MethodWithDependency(SomeClass someObject)
{
}
}
答案 0 :(得分:4)
需要解析依赖关系的每个对象都可能通过容器解析它们。为了不破坏容器的代码,您可以在Composition Root中创建本地工厂并在其他地方实现特定的工厂提供程序,这是应用程序中创建和直接使用容器的唯一位置。
这需要遵守规则,但是您可以构造代码,以便除了Composition Root之外没有对容器的显式引用,而仍然容器可以完成工作。
我曾经写了一篇教程,在这里引用它太长了:
http://www.wiktorzychla.com/2012/12/di-factories-and-composition-root.html
回答您的具体问题:要拥有单身,您只需使用ContainerControllerLifetimeManager
作为注册方法的参数。
http://msdn.microsoft.com/en-us/library/ff660872(v=pandp.20).aspx
答案 1 :(得分:2)
创建MyClass2
,使其在构造函数中接受SomeClass
作为参数(您将SomeClass
依赖项注入MyClass2
对象中。
然后,您可以使用Container注册实例。此时,当您解析MyClass2
个对象时,您的SomeClass
对象也将被解析并注入MyClass2
。
漂亮,是吗?
public class MyClass1
{
private UnityContainer _container;
public void Main()
{
this.RegisterContainer();
// Since SomeClass was registered, when you resolve MyClass2, it will
// magically resolve an instance of SomeClass that the MyClass2
// constructor needs.
var myObject2 = this._container.Resolve<MyClass2>;
myObject2.MethodWithDependency();
}
private void RegisterContainer()
{
// Here, initialize your Container then register your singletons.
this._container = new UnityContainer();
// Do not use container.RegisterType<>()....
// RegisterInstance, by default, implements a singleton behavior.
this._container.RegisterInstance<SomeClass>();
this._container.RegisterInstance<MyClass2>();
}
}
public class MyClass2
{
private SomeClass _someClass;
// You are injecting the SomeClass dependency into your MyClass2 class.
// Hence the name — Dependency Injection.
public MyClass2(SomeClass someClass)
{
this._someClass = someClass;
}
public void MethodWithDependency()
{
// use your _someClass object.
this._someClass.DoSomething();
}
}