在控制台应用程序中使用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