簡體   English   中英

WebAPI。 在繼承的情況下使用Ninject進行依賴注入

[英]WebAPI. Dependency injection with Ninject in case of inheritance

我是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);
      }

User實體的具體Controller

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) { .... } ... 

哦..我已經花了數小時嘗試不同的方法。 太瘋狂了。 而且有趣的是,除了一個可訪問性修飾符之外, Ninject運行良好並且代碼正確。 public修飾符添加到UsersController ctor可以解決此問題。

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

...

PS。 仔細編寫代碼...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM