0

ASP.NETMVCプロジェクトのNinject3.0.1.10から、悪名高い「XYZのアクティブ化中にエラーが発生しました。一致するバインディングがありません。何とか何とか何とか」が表示されます。

バインディングの設定方法は次のとおりです(非常に簡単です)。

public static class NinjectWebCommon 
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));

            bootstrapper.Initialize(CreateKernel);
        }

        /// <summary>
        /// Stops the application.
        /// </summary>
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }

        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();

            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
            RegisterServices(kernel);

            return kernel;
        }

        private static void RegisterServices(IKernel kernel)
        {
            string connectionString = WebConfigurationManager.ConnectionStrings["STAGING"].ConnectionString;

            kernel.Bind<IUserAccountRepository>()
                  .To<SqlUserAccountRepository>()
                  .WithConstructorArgument("connectionString", connectionString);

            kernel.Bind<IRecipeRepository>()
                  .To<SqlRecipeRepository>()
                  .WithConstructorArgument("connectionString", connectionString);

            kernel.Bind<HomeViewModel>().ToSelf();
        }
    }

コントローラのインデックスアクションが呼び出されると、HomeViewModelオブジェクトを次のように作成しようとします。

public ActionResult Index()
{
    IKernel      kernel = new StandardKernel();
    HomeViewModel model = kernel.Get<HomeViewModel>();

    ...

例外をトリガーするもの:

Error activating IRecipeRepository No matching bindings are available, and the type is not self-bindable. 
Activation path: 
2) Injection of dependency IRecipeRepository into parameter recipeRepository of constructor of type HomeViewModel  
1) Request for HomeViewModel

しかし、RegisterServicesでkernel.Bindを呼び出した直後にHomeViewModelのインスタンスを取得しようとすると、正常に機能します。

HomeViewModelは次のようになります(簡潔にするために一部の詳細は削除されています)。

public class HomeViewModel
{
    public HomeViewModel(IRecipeRepository      recipeRepository,
                         IUserAccountRepository userAccountRepository)
    {
        this.recipeRepository = recipeRepository;
        this.userAccountRepository = userAccountRepository;
    }

    //
    // Some details removed for sake of brevity
    //

    private readonly IRecipeRepository      recipeRepository;
    private readonly IUserAccountRepository userAccountRepository;
}

私が欠けているものはありますか?この場合、コントローラーが「特別」なのはなぜですか。

4

0 に答える 0