繁体   English   中英

如何注入简单的注射器

[英]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);    
 Am I missing some magical feature which will just make all my registered services available in any 

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

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

根本不需要注册实例。 您可以创建一个接口然后像ILogger一样进行注册,但是将该方法设为虚拟并直接使用类名也可以。 您可以在此处阅读有关此主题的更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM