[英]How to inject with simple injector
我正在努力确定这是否是将我的Console Application Main方法中的依赖项注入我的主应用程序类实例的正确方法。
我有以下代码:
计划类
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如何使用它,将一个服务注册到管道中,并且它们都可供我在每个控制器的构造函数中选择。
我担心的是我可能有20-30个服务,所有这些都需要作为参数注入每次我“新建”一个类的新实例,以便它们可用于我的新类中的构造函数。
我是否遗漏了一些神奇的功能,它将使我在所有新初始化的构造函数中提供的所有注册服务都可供我参考,就像我使用ASP.Net Core一样?
不,没有魔力。
您缺少的是AspNetCore自动解析您的控制器,它解析了控制器所具有的依赖关系的整个对象图 (即控制器的任何依赖关系,这些依赖关系的依赖关系等)
同样,在控制台应用程序中,您需要解析整个对象图(通常在启动时)。
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();
}
实际上,“代理人”应被视为整个申请 。 控制台只是一个设置动态的外壳。 请注意,在大多数情况下从控制台应用程序传入args可能是明智的,因此可以根据需要对“代理”进行解析和响应。
agent.Start(args);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.