2

これは、コントローラーがコンストラクターでaDataContextCreatorと aを必要とする MVC アプリケーションです。CustomerIDControllerFactoryのように見えます:

public class NinjectControllerFactory : DefaultControllerFactory
    {
        private IKernel ninjectKernel;

        public NinjectControllerFactory()
        {
            ninjectKernel = new StandardKernel();
            AddBindings();
        }


        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            if (controllerType == null)
            {
                return null;
            }
            else
            {
                string customerID =  requestContext.HttpContext.Session["CustomerID"].ToString();
                return (IController)ninjectKernel.Get(controllerType, new IParameter[]{new Parameter("CustomerID", customerID, true)});
            }
        }

        private void AddBindings()
        {
            ninjectKernel.Bind<IDataContextCreator>().To<DefaultDataContextCreator>();
        }
    }

ページに移動するとき、つまりコントローラーの作成をトリガーするときに、次のエラーが発生します。

 Ninject.ActivationException: Error activating int
No matching bindings are available, and the type is not self-bindable.
Activation path:
 2) Injection of dependency int into parameter CustomerID of constructor of type MyController
 1) Request for MyController

上記はすべて、Win 7 で MVC3 .Net 4 を使用しています。ご協力ありがとうございます。

4

1 に答える 1

6

なぜカスタム コントローラ ファクトリを作成したのですか? Ninject.MVC3NuGet パッケージを使用する場合、これは一般的ではありません。より一般的な手法は、この NuGet のインストール時に自動的に登録されるカスタム依存関係プロバイダーを使用することです。

手順は次のとおりです。

  1. カスタム コントローラ ファクトリを取り除く
  2. Ninject.MVC3NuGet パッケージをインストールします。
  3. ファイル内で~/App_Start/NinjectWebCommon.csカーネルを構成します

    private static void RegisterServices(IKernel kernel)
    {
        kernel
            .Bind<IDataContextCreator>()
            .To<DefaultDataContextCreator>();
        kernel
            .Bind<MyController>()
            .ToSelf()
            .WithConstructorArgument("customerID", ctx => HttpContext.Current.Session["CustomerID"]);
    }        
    
于 2012-10-15T21:11:35.687 に答える