编程语言
首页 > 编程语言> > 在控制台应用程序中使用Unity 3.5构造函数注入 – C#

在控制台应用程序中使用Unity 3.5构造函数注入 – C#

作者:互联网

我有一个控制台应用程序,它引用了许多dll.控制台应用程序需要实例化这些dll中的对象.这些dll具有我想要注入其构造函数的依赖项.我的要求是在控制台应用程序中进行所有注册 – 它是组合根.我可以做到这一点,但是如何在不传递/引用UnityContainer的情况下将这些注册持久存储到库中?

我想避免服务定位器模式,纯粹使用构造函数/方法注入.如果可能的话,这些都不是:

_container.Resolve<IData>()  // not what I want

这是我在控制台应用程序中得到的内容:

            static IUnityContainer _container;

            static void Main(string[] args)
                    {
                        LoadContainer();
                        var worker = new Worker(_container.Resolve<IData>()); // I don't like this
                        worker.Start();
                    }

            private static void LoadContainer()
                    {
                        _container = new UnityContainer();

                        // This will register all types with a ISample/Sample naming convention 
                        _container.RegisterTypes(
                            AllClasses.FromLoadedAssemblies(),
                            WithMappings.FromMatchingInterface,
                            WithName.Default);
                    }

当我在类Worker中时,如何将依赖项注入其他类的构造函数?在MVC中,我可以在UnityConfig中轻松处理这个问题,但无法弄清楚这个场景.我觉得我应该能够在控制台中引导所有内容并完成它.是否有Unity扩展可以帮助解决这个问题?

解决方法:

假设Worker在容器中注册,可以是具体类型,也可以是IWorker:

var worker = _container.Resolve<IWorker>();

要么

var worker = _container.Resolve<Worker>();

然后:

worker.Start();

如果Worker位于对象图的顶部,并且所有依赖关系都从它流出,那么这应该就是您所需要的.这不是服务位置,因为您只调用Resolve()一次,并在组合根目录中执行此操作.只有组合根知道你的容器.

编辑

从你的评论 – 所以假设这是你的设置:

public class Root
{
    private readonly A _a;

    public Root(A a)
    {
        if (a == null) throw new ArgumentNullException("a");
        _a = a;
    }
}

public class A
{
    private readonly B _b;

    public A(B b)
    {
        if (b == null) throw new ArgumentNullException("b");
        _b = b;
    }
}

public class B
{
    private readonly C _c;

    public B(C c)
    {
        if (c == null) throw new ArgumentNullException("c");
        _c = c;
    }
}

public class C
{

}

假设您已在Unity中正确设置了所有注册,您只需在图表的顶部解析:

var root = _container.Resolve<Root>();

容器将完成其余的工作. “root”现在是一个容器管理的对象,因此容器可以解析依赖关系的完整图形.

这是构造函数注入,而不是服务位置.系统中唯一知道容器的对象是组合根 – 您调用Resolve()的唯一位置是Main()方法.

同样,我可能会误解你的问题,但我所描述的几乎是DI构造函数注入的基本用例.

标签:c,inversion-of-control,ioc-container,unity-container
来源: https://codeday.me/bug/20190624/1278938.html