如何使用依赖注入继承类?

San*_*v S 1 c# model-view-controller dependency-injection ninject asp.net-web-api

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

public class BaseApiController : ApiController
{
    readonly IAccessService _accessService; 
    public BaseApiController(IAccessService accessService)
    {
        this._accessService = accessService;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    public DiscoverController(IDiscoverService discoverService,IAccessService accessService)  
    {
        _accessService = accessService;
        _discoverService = discoverService;
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做而不修改派生类ctor采取类似的参数并将该值传递给基本ctor,如果你建议更好的方法处理这个,我将不胜感激?

Ste*_*ven 6

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

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

你做错了是你:

您可以IAccessService在基类中使用它来执行某些安全检查.而不是使用基类,有更好的方法.一般的解决方案是使用装饰器,但这不适用于Web API.相反,使用Web API,您可以使用DelegateHandlers并将它们添加到管道中.这样的处理程序就像装饰器一样,允许您透明地应用安全等交叉问题.