c# - 如何对继承类使用依赖注入(inject)?

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

我在这里使用了 DI 框架 (Ninject),它运行良好。但面临的问题之一是,我有一个基类,它带有一个构造函数,该构造函数采用接口(interface)的实现。

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

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

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

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

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

最佳答案

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

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

你做错的是你:

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

关于c# - 如何对继承类使用依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29600891/

相关文章:

c# - 有没有办法在运行时动态加载数据提供者?

c# - 如何在 C# 中做标志

c# - mvc 中创建表单的默认值

javascript - 添加 View 以打开钛窗口

java - Spring & Java Generics - 在抽象 Controller 中获取一项服务的实例

c# - 如何在 C# 中以编程方式启用 MSMQ?

c# - SOAP header 中的 WCF 用户名和密码

multithreading - Entity Framework 创建模型时无法使用上下文

java - 如何使用 Mockito 和 JUnit 定义通过链依赖调用的方法的行为?

asp.net-mvc - SimpleInjector - 装饰器没有启动?