gpt4 book ai didi

c# - 如何用简单的注入(inject)器注入(inject)

转载 作者:太空宇宙 更新时间:2023-11-03 22:49:13 24 4
gpt4 key购买 nike

我正在努力确定这是否是将依赖项从我的 Console Application Main 方法注入(inject)到我的主要应用程序类实例中的正确方法。

我有以下代码:

程序类

static void Main(string[] args)
{
var container = new SimpleInjector.Container();

// Registrations here.
container.Register<ILogger, FileLogger>();

//Verify the container.
container.Verify();

ILogger log = container.GetInstance<ILogger>();

log.Info("Logging From Main Method");

//Start Main Agent
MainAgent agent = new MainAgent(log);
agent.Start();
}

主要代理类

public class MainAgent
{
private ILogger log;

public MainAgent(ILogger _log)
{
log = _log;
}

public void Start()
{
//Main Application Code here.
Console.WriteLine("main Agent Started.");
log.Info("Logging through logger in MainAgent Class");
Console.ReadLine();
}
}

我有在 ASP.Net Core 中编写 DotNetCore 应用程序的背景,所以我习惯了 DI 如何与它一起工作,将服务注册到管道中,并且它们都可供我在每个 Controller 的 cherry pick 中使用构造函数。

我担心的是我可能有 20-30 个服务,每次我“新建”一个类的新实例时,所有这些服务都需要作为参数注入(inject),以便它们可供我新的构造函数使用类。

我是否缺少一些神奇的功能,它只会让我所有注册的服务在任何新初始化的构造函数中可用,供我引用,就像我使用 ASP.Net Core 一样?

最佳答案

不,没有魔法。

您缺少的是 AspNetCore 在幕后自动解析您的 Controller ,它解析 Controller 具有的依赖项的整个对象图(即, Controller 的任何依赖项,这些依赖项的依赖项等)

类似地,在控制台应用程序中,您需要解析整个对象图(通常在启动时)。

static void Main(string[] args)
{
// Begin Composition Root

var container = new SimpleInjector.Container();

// Registrations here.
container.Register<ILogger, FileLogger>();
container.Register<IMainAgent, MainAgent>();

//Verify the container.
container.Verify();

// End Composition Root

MainAgent agent = container.GetInstance<IMainAgent>();

//Start Main Agent
agent.Start();
}

实际上,“代理”应该被视为整个应用。控制台只是一个让一切都运转起来的外壳。请注意,在大多数情况下,从控制台应用程序传递参数可能是明智的,因此“代理”可以根据需要解析和响应它们。

agent.Start(args);    

关于c# - 如何用简单的注入(inject)器注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48302380/

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