如何从POCO中访问DI注册实例?

时间:2019-02-12 15:55:33

标签: c# .net generics dependency-injection .net-core

这是一个.NET Core项目。在启动中,我为翻译服务注册了一个单例,并使用来自appsettings.json的配置设置进行了初始化。设置完成后,整个应用将使用该服务。这在我的控制器和存储库中效果很好,我只定义了构造函数以采用该接口,并按预期进行注入:

services.AddSingleton<Foo.Bar.ITranslationService>(
    new Foo.Bar.SomeTranslator(config.TranslationSettings));

但是我遇到的一个问题是POCO需要使用该翻译服务。而且我的POCO都由存储库生成为泛型,因此例如,存储库方法可能如下所示:

public TEntity GetById(object id){
    return connection.Get<TEntity>(id);
}

因此,存储库中已经注入了注入的TranslationService,但是是否有一种方法可以使用DI干净地将其传递给需要它的POCO?还是我需要以某种方式破解它?我正在尝试找出最干净的方法,谢谢!

2 个答案:

答案 0 :(得分:1)

财产注入怎么样?

get_volume

答案 1 :(得分:0)

基本上,您需要将转换接口添加到该对象的构造函数。

public class MYPOCO
{
    private Foo.Bar.ITranslationService translator
    public MYPOCO(Foo.Bar.ITranslationService translator)
    {
        this.translator = translator;
    }
}

然后,您可以在课程中使用翻译服务。但是您在那里会遇到许多问题。

  • 除非框架明确创建了您的POCO,否则它将不会 被注射。例如,它需要成为某些设备的控制器 路由一经框架就会创建的排序 叫。
  • 您可能需要自己的工厂来创建POCO的实例。
  • 要保持POCO尽可能整洁,您可能需要一个Factory,该工厂将创建POCO的实例并适当地设置翻译。工厂将采用翻译服务的一个实例。