0

これは私を怒らせています。Ninject のドキュメントを読んだ、Ninject MVC 拡張機能のドキュメントを読んだ、読んだ関連する SO の質問の数を失った、コードのどこに問題があるのか​​ わかりません。

ASP.NET MVC 4 で webapp を構築しており、Ninject を使用してリポジトリ インターフェイスをバインドしています。ドキュメントによると、NuGetを使用してNinjectを追加すると(私はそうしました)、すべてが配線されるため、アプリケーションを継承する必要はなくNinjectHttpApplication(私はしていません)、バインディングを追加するだけで済みますでNinjectWebCommon.RegisterServices()、(私が持っています)。と がありIRepository<T>ますRepository<T>。ユーザーリポジトリには、ログインと登録のための追加のメソッドがいくつかあるため、UserRepositoryを実装する別のメソッドがありますIRepository<User>。したがって、私のバインディングは次のようになります。

kernel.Bind(typeof(IRepository<>)).To(typeof(BaseRepository<>)).InRequestScope();
kernel.Bind(typeof(IRepository<User>)).To(typeof(UserRepository)).InRequestScope();

ドキュメントといくつかの SO の質問では、NuGet を使用して Ninject を追加した場合 (私が行った場合)、コントローラー ファクトリが整理され、独自の Ninject-y コントローラー ファクトリを実装する必要がないことも言及されています (したがって、私はそうではありません)。私のコントローラーは、互換性のある一連のリポジトリBaseControllerを受け入れるコンストラクターを持つから継承します。IRepository今、私が読​​んだことから、コントローラーを使用しようとすると、Ninject はIRepositoriyパラメーターを認識して提供する必要があります。そうではありません。コンストラクターに属性を配置し[Inject]ても、無視されます-代わりにパラメーターなしのコンストラクターが呼び出されます。パラメーターなしのコンストラクターを削除すると、コンパイル エラーが発生し、コンストラクターがないことを訴えます。

私は何を逃したのですか?Ninject にリポジトリを提供させるにはどうすればよいですか?

4

1 に答える 1

2

奇妙なことに、あなたが説明している問題を再現できません。

手順:

  1. インターネット テンプレートを使用して新しい ASP.NET MVC 4 アプリケーションを作成する
  2. Ninject.MVC3NuGetをインストールする
  3. いくつかのクラスを定義します:

    public interface IRepository<T>
    {
    }
    
    public abstract class BaseRepository<T> : IRepository<T>
    {
    }
    
    public class User
    {
    }
    
    public class UserRepository : BaseRepository<User>
    {
    }
    
    public abstract class BaseController<T>: Controller
    {
        protected BaseController(IRepository<T> repository)
        {
            this.Repository = repository;
        }
    
        protected IRepository<T> Repository { get; private set; }
    }
    
    public class HomeController : BaseController<User>
    {
        public HomeController(IRepository<User> repository): base(repository)
        {
        }
    
        public ActionResult Index()
        {
            return Content(this.Repository.GetType().ToString());
        }
    }
    
  4. そして、それらを次のように配線します~/App_Start/NinjectWebCommon.cs

    private static void RegisterServices(IKernel kernel)
    {
        kernel
            .Bind(typeof(IRepository<User>))
            .To(typeof(UserRepository))
            .InRequestScope();
    }        
    
  5. アプリケーションを実行すると、リポジトリの適切なインスタンスが HomeContorller に挿入されます。

于 2013-03-17T13:54:07.107 に答える