gpt4 book ai didi

c# - 在控制台应用程序中使用 Unity 3.5 的构造函数注入(inject) - C#

转载 作者:太空狗 更新时间:2023-10-30 01:19:18 27 4
gpt4 key购买 nike

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

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

_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 类中时,我如何将依赖项注入(inject)其他类的构造函数?在 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”现在是容器管理的对象,因此容器可以解析完整的依赖关系图。

这是构造函数注入(inject),不是服务位置。系统中唯一了解容器的对象是组合根——您调用 Resolve() 的唯一地方是在 Main() 方法中。

同样,我可能误解了你的问题,但我所描述的几乎是 DI + 构造函数注入(inject)的基本用例。

关于c# - 在控制台应用程序中使用 Unity 3.5 的构造函数注入(inject) - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23479502/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com