【问题标题】:How to use dependency injection for inherited class?如何对继承的类使用依赖注入?
【发布时间】:2015-06-18 12:02:32
【问题描述】:

这里我使用 DI 框架 (Ninject),它工作正常。但是面临的一个问题是,我有一个带有单个构造函数的基类,该构造函数采用接口的实现。

public class BaseApiController : ApiController
{
    readonly IAccessService _accessService; 
    public BaseApiController(IAccessService accessService)
    {
        this._accessService = accessService;
    }
}

当我从这个基类继承到所有其他控制器时,这些控制器具有实现自己的接口的构造函数。我收到错误“BaseApiController”不包含带有 0 个参数的构造函数,好的,我明白了。派生类是

 public class DiscoverController  : BaseApiController
{
    readonly IDiscoverService _discoverService;
    readonly IAccessService _accessService;

    public DiscoverController(IDiscoverService discoverService,IAccessService accessService)  
    {
        _accessService = accessService;
        _discoverService = discoverService;
    }
}

如果不修改派生类 ctor 以采用类似的参数并将该值传递给基 ctor,我怎么能做到这一点,如果您提出更好的处理方法,我将不胜感激?

【问题讨论】:

    标签: c# model-view-controller dependency-injection ninject asp.net-web-api


    【解决方案1】:

    正如@Christian 所说,该错误是 C# 编译器错误,因为您必须通过依赖项。

    您可能已经注意到,拥有这样的基类并不是一种真正令人愉快的工作方式。您必须将此依赖项注入每个控制器并将其传递给基本控制器。更糟糕的是,当基本控制器需要第二个依赖项时,您将不得不更新控制器的所有构造函数。

    你做错了什么是你:

    您在基类中使用这个IAccessService 可能是为了进行某些安全检查。除了使用基类,还有更好的方法。一个通用的解决方案是使用装饰器,但这不适用于 Web API。相反,通过 Web API,您可以使用 DelegateHandlers 并将它们添加到管道中。这样的处理程序就像一个装饰器,允许您透明地应用横切关注点,例如安全性。

    【讨论】:

      【解决方案2】:

      尝试修改派生构造函数使其将参数传递给基类:

      public class DiscoverController  : BaseApiController
      {
         readonly IDiscoverService _discoverService;
         readonly IAccessService _accessService;
      
         public DiscoverController(IDiscoverService discoverService,IAccessService accessService)  : base(accessService)
         {
            _discoverService = discoverService;
         }
      }
      

      【讨论】:

        【解决方案3】:

        使用 : base 关键字修改 DiscoverController(您将使用父构造函数): https://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx

        【讨论】:

          猜你喜欢
          • 2023-03-28
          • 1970-01-01
          • 1970-01-01
          • 2021-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-11
          • 2011-12-24
          相关资源
          最近更新 更多