C# 如何使用简易注射器注射

C# 如何使用简易注射器注射,c#,dependency-injection,simple-injector,C#,Dependency Injection,Simple Injector,我正在努力确定这是否是将依赖项从控制台应用程序Main方法注入主应用程序类实例的正确方法 我有以下代码: 程序类 static void Main(string[] args) { var container = new SimpleInjector.Container(); // Registrations here. container.Register<ILogger, FileLogger>(); //Verify the containe

我正在努力确定这是否是将依赖项从控制台应用程序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.NETCore中编写DotNetCore应用程序,因此我习惯了DI如何使用它,将服务注册到管道中,并且它们都可以由我在每个控制器的构造函数中挑选

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

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

不,没有神奇

您缺少的是,AspNetCore会在封面下自动解析控制器,这会解析控制器具有的依赖项的整个对象图(即控制器的任何依赖项、这些依赖项的依赖项等)

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

简单回答是您是SimpleInjector支持直接创建对象

var agent = container.GetInstance<MainAgent>();
var-agent=container.GetInstance();
根本不需要注册实例。
您可以创建一个接口,然后像创建ILogger一样注册,但是将方法设置为虚拟并直接使用类名也可以。您可以阅读有关该主题的更多内容

您不应该自己实例化MainAgent之类的类。你的容器应该这样做。它需要使用反射来查看需要哪些接口,并生成所需接口的实例。通常,在实例化顶级类时,容器需要创建一个完整的实例树,以满足整个应用程序树中构造函数的需要。
agent.Start(args);    
Am I missing some magical feature which will just make  all my registered services available in any
var agent = container.GetInstance<MainAgent>();