【问题标题】:WebAPI. Dependency injection with Ninject in case of inheritance网络API。在继承的情况下使用 Ninject 进行依赖注入
【发布时间】:2013-03-08 22:44:51
【问题描述】:

我对 ASP.NET WebApi 项目还很陌生,但希望我能把所有事情都说清楚。在创建了几个 CRUD 控制器之后,我想到了一个绝妙的主意 - 为所有这些控制器编写通用的基本 CRUD-web-API 控制器,并且不要混淆重写相同的代码。
在成功实现此类后,我遇到了依赖解析的问题,这对于非泛型/继承的控制器仍然可以正常工作。
简单的请求(GET、POST 等)给出:
Type 'UsersController' does not have a default constructor","ExceptionType":"System.ArgumentException"

没有注入的默认构造函数可以正常工作。显然我的 Ninject 配置有问题。

public abstract class BaseCRUDController<T> : ApiController where T : class, IClientEntity 
   {
      private readonly Repository<T> _repo;
      private readonly IDbContextDataProvider _context;

      // With this ctor everything works well
      public BaseCRUDController()
      {
         this._context = new ModelContext();
         this._repo = new Repository<T>(this._context);
      }

      // Injection is not working ((
      public BaseCRUDController(IDbContextDataProvider context)
      {
         this._context = context;
         this._repo = new Repository<T>(context);
      }

具体的Controller 代表User 实体:

public class UsersController : BaseCRUDController<User>
{      
  UsersController(IDbContextDataProvider context) : base(context) { }

  UsersController() : base() { }
}

还有 Ninject 配置本身:

public class DataProviderModule : NinjectModule
{
  public override void Load()
  {
     this.Bind<IDbContextDataProvider>().To<ModelContext>().InSingletonScope();
  }
}
public class NinjectResolver
{
  // Instantinate Ninject dependencies resolver
  public static System.Web.Http.Dependencies.IDependencyResolver GetConfiguredDependencyResolver()
  {
     IKernel kernel = new StandardKernel(new DataProviderModule());
     System.Web.Http.Dependencies.IDependencyResolver njResolver = new NinjectResolver(kernel);
     return njResolver;
  }
}

还有Application_Start

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    var config = GlobalConfiguration.Configuration;
    config.DependencyResolver = NinjectResolver.GetConfiguredDependencyResolver();

    WebApiConfig.Register(config);

我在这里做错了什么?


注意:如果我有,这种方法效果很好:
public class UsersController : ApiController
{      
  UsersController(IDbContextDataProvider context)
  {
     .... 
  }    

...

【问题讨论】:

  • 是否有可能正在使用 MVC 解析器,而不是 Web API 依赖解析器?我想知道框架是否可能在这里选择了错误的解析器,因为您的控制器不会立即从 ApiController 派生。您可以通过堆栈跟踪来追踪这一点 - 我遇到了一个类似的问题,这就是问题所在。
  • @BrianS 感谢您的建议。我会看看这个。
  • 我已经在我的一个测试项目中尝试过这个,它可以正常工作。看起来我正在实施的 Ninject 与您的实施方式略有不同。我使用了thisthis 的组合方法。
  • @BrianS 即使使用您提供的链接的方法,我也有相同的结果(

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


【解决方案1】:

哦.. 我花了好几个小时尝试不同的方法。那是疯狂。这里有趣的部分是Ninject 运行良好并且代码是正确的,除了一个可访问性修饰符。将public 修饰符添加到UsersController ctor 解决了这个问题。

public class UsersController : BaseCRUDController<User>
{      
  public UsersController(IDbContextDataProvider context) : base(context) { }

...

PS。仔细编写代码...

【讨论】:

    猜你喜欢
    • 2012-05-03
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多