2013-03-08 110 views
0

我很新ASP.NET WebApi項目,但希望我會把一切足夠直。在創建幾個CRUD控制器之後,出現了一個絕妙的想法 - 爲所有人編寫通用的基礎CRUD-web-API控制器,並且不要重寫相同的代碼。
成功實現這樣的類後,我遇到了依賴關係解析問題,對於非通用/繼承控制器仍然可以正常工作。
簡單的請求(GET,POST等)給出了:不打針
Type 'UsersController' does not have a default constructor","ExceptionType":"System.ArgumentException"WebAPI。與Ninject依賴注入在繼承的情況下

默認的構造工作正常。很明顯,我對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) 
    { 
    .... 
    }  

... 
+0

是否有可能使用MVC解析器,而不是Web API依賴解析器?我想知道框架是否有可能在這裏選擇錯誤的解析器,因爲你的控制器不能立即從ApiController派生出來。你可以通過堆棧跟蹤來追蹤這一點 - 我遇到了一個模糊的類似問題,這是問題所在。 – 2013-03-08 22:56:54

+0

@BrianS感謝您的諮詢。我會看看這個。 – 2013-03-08 23:03:36

+0

我已經在我的一個測試項目上試過了,它的工作沒有問題。看起來我正在實施Ninject與你如何做有點不同。我使用了[this](http://www.peterprovost.org/blog/2012/06/19/adding-ninject-to-web-api/)和[this](http://www.peterprovost .org/blog/2012/06/19/adding-ninject-to-web-api /)方法。 – 2013-03-09 00:04:15

回答

1

哦..我已經花了幾個小時嘗試不同的方法。這是瘋狂。這裏有趣的部分是Ninject工作正常,代碼是正確的,只有一個可訪問性修飾符。將public修飾符添加到UsersController ctor修復了問題。

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

... 

PS。仔細寫下代碼...