c# - 在 Base Controller 中实现依赖注入(inject)的最佳方式是什么

标签 c# rest asp.net-web-api dependency-injection

我遇到了以下问题,在我的基本 Controller 中我进行了依赖注入(inject)。我有一个实现基本 Controller 的子类,我需要传递构造函数。所以我的疑问是,我实现依赖注入(inject)的方式是否正确? 如果不是,最好的方法是什么?

我用unity实现D.I,ide是VS2017 web api 2。

按照我使用的代码: 基本 Controller 或父 Controller :

public class BaseController : ApiController
{
    public string[] includes = null;

    private readonly IFiltroServico servico;
    public BaseController(IFiltroServico _servico)
    {
        servico = _servico;
    }
}

泛型类型的基础 Controller 实现基础 Controller :

 public abstract class BaseController<E, R, F> : BaseController
        where E : class
        where R : class
        where F : class
    {
    private readonly IFiltroServico servico;
            public AreaFormacaoController(IFiltroServico _servico): base(_servico)
            {
                servico = _servico;
            }
}

子 Controller :

    public abstract class BaseController<R> : BaseController
            where R : class
        {
private readonly IFiltroServico servico;
        public AreaFormacaoController(IFiltroServico _servico): base(_servico)
        {
            servico = _servico;
        }
     //services of controller;
        }

最佳答案

您不需要一遍又一遍地定义私有(private)字段servico,因为它已经在基本 Controller 中预设了。只需在基类中将其定义为 protected readonly 并在子类中使用即可。

除此之外你的代码没问题。

子级在构造函数中具有相同的依赖参数是完全合理的,因为它继承了最有可能依赖依赖的基类的行为。

另一种选择是使用 property injection在基类中,但您需要向该属性添加一个特定于统一的属性。我不喜欢这样,因为您您的代码直接绑定(bind)到 Unity。

关于c# - 在 Base Controller 中实现依赖注入(inject)的最佳方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49406645/

相关文章:

c# - 有 1 个 pKey 和 2 个属性的组合键可以吗

rest - GET 方法对 HTTP 位置资源的可用性

c# - 如何解密 Web API 2 JWT token ?

.net - 访问路径 'Google.Apis.Auth' 被拒绝

asp.net-mvc - 如何在asp.net core mvc header 中传递jwt token

C# 转换问题 - 简洁

c# - 仅在 Visual Studio 2015 中的 Debug模式下抛出 WebDriverWait 异常

c# - 相对于它始终面对的点移动对象会导致螺旋轨道

rest - 返回隐藏了大多数属性的实体列表的 RESTful 资源的命名约定?

c# - ServiceStack 嵌套数组错误 : KeyValueDataContractDeserializer: Error converting to type: Type definitions should start with a '{'