我正在努力确定这是否是将依赖项从控制台应用程序主方法注入到主应用程序类实例中的正确方法。

我有以下代码:

课程类别

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);

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

10-12 04:07