我是否将单身作为参数传递或手动解决它们? (Unity DI)

时间:2013-12-16 18:52:14

标签: c# dependency-injection unity-container

我使用的是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)
        {
        }
    }

2 个答案:

答案 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();
    }
}