我很新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)
{
....
}
...
是否有可能使用MVC解析器,而不是Web API依賴解析器?我想知道框架是否有可能在這裏選擇錯誤的解析器,因爲你的控制器不能立即從ApiController派生出來。你可以通過堆棧跟蹤來追蹤這一點 - 我遇到了一個模糊的類似問題,這是問題所在。 – 2013-03-08 22:56:54
@BrianS感謝您的諮詢。我會看看這個。 – 2013-03-08 23:03:36
我已經在我的一個測試項目上試過了,它的工作沒有問題。看起來我正在實施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