如何注入简单的注射器

时间:2018-01-17 13:31:47

标签: c# dependency-injection simple-injector

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

我有以下代码:

计划类

const data = {"questions":[{"question":"lala","answer":"papa","categories":["Handla"]},{"question":"xxxx","answer":"yyyy","categories":["Reklamation"]},{"question":"abcefg","answer":"gooooogle","categories":["Reklamation"]}]}

const result = [...data.questions.reduce((r, e) => {
  return r.add(...e.categories), r
}, new Set)]
console.log(result)

主要代理类

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

我来自在ASP.Net Core中编写DotNetCore应用程序的背景,所以我习惯了DI如何使用它,将服务注册到管道中,并且它们都可供我在每个控制器中使用构造

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

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

2 个答案:

答案 0 :(得分:3)

不,没有魔力。

您缺少的是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);    

答案 1 :(得分:0)

msgsnd

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

'use strict';
// Imports the Google Cloud client library
const vision = require('@google-cloud/vision');

// Creates a client
const client = new ImageAnnotatorClient({
projectId: 'my-project-xxx',
 keyFilename: 'Users/xxx/Downloads/xxx.json',
});

// Performs label detection on the image file
client
 .labelDetection('.//Users/xxx/Downloads/menu.jpg')
 .then(results => {
   const labels = results[0].labelAnnotations;

console.log('Labels:');
labels.forEach(label => console.log(label.description));
})
.catch(err => {
  console.error('ERROR:', err);
 });

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

的更多信息