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