0

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

...
4

1 に答える 1

1

ああ..さまざまなアプローチを試すのに何時間も費やしました。それは狂気でした。ここで面白いのは、Ninject1 つのアクセシビリティ修飾子を除いて、うまく機能し、コードが正しいことです。ctorpublicに修飾子を追加するとUsersController、問題が修正されました。

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

...

PS。コードを慎重に書いてください...

于 2013-03-11T21:39:59.967 に答える