0

EF5 と ninject を使用して MVC4 アプリを構築しています。MVC3 から 4 にアップグレードしたときに何かが壊れました。そのため、まったく新しいソリューションを作成し、すべてのナゲット パッケージを取得し、すべての参照を追加してから、コードにコピーしました。

プロジェクトのビルド、素晴らしいです。

私の問題は(Ninjection)spですか?正しく配線されていないようです。ページを読み込もうとすると、実行時エラーとして「このオブジェクトにパラメーターのないコンストラクターが定義されていません」が表示されます。ただし、空の public パラメーターなしのコンストラクターを追加するだけで、ページがレンダリングされ、すべてがうまくいきます。

私のApp_Startコードは正常に動作します.NinjectWebCommon.cs(質問の下部に含まれています)コードをステップ実行しましたが、それ以外はコピーして貼り付け、オンラインのチュートリアルに従ってください。次に何をすべきかを知るのに十分なほど IoC を理解していません。

namespace search.Controllers
{
    public class HomeController : Controller
    {
        ICamaService _service = null;

        [Inject]
        public HomeController(ICamaService  service)
        {
            _service = service;
        }
        ************** ADDING THIS FIXES THE RUNTIME ERROR *********
        public HomeController(){
        ;
        }
        ***********

        //TODO: ADD ACTIONS

        public ViewResult Index()
        {
            return View();

        }
    }
}

これが私の構成ルートです:

[assembly:     WebActivator.PreApplicationStartMethod(typeof(search4.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(search4.App_Start.NinjectWebCommon), "Stop")]

namespace search4.App_Start
{
using System;
using System.Web;

using Microsoft.Web.Infrastructure.DynamicModuleHelper;

using Ninject;
using Ninject.Web.Common;
using search.Services;
using search.Data;

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

    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    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)
    {
        kernel.Bind<ICamaContext>().To<CamaContext>().InRequestScope();
        kernel.Bind<ICamaService>().To<CamaService>().InRequestScope();

    }        

}
}

![例外の画面キャプチャ][1]

http://shareimage.ro/viewer.php?file=svs5kwamqy0pxbyntig4.gif

4

3 に答える 3

1

私は Ninject ユーザーではありませんが、MVC の他の IOC フレームワークでの経験から、DefaultControllerFactory を、デフォルト コンストラクターを要求する代わりにオブジェクトを注入する実装に置き換える必要があります。

于 2012-09-19T19:20:25.703 に答える
0

バインディングが適切に登録されていないようです。

何が問題なのか正確にはわかりませんが、私のために機能する NinjectApplicationModule を作成します。

/// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Load(new NinjectApplicationModules());
    } 


public class NinjectApplicationModules : NinjectModule
{
    /// <summary>
    /// Loads the Binding module into the kernel. Used to map Abstract Classes to Concrete classes at runtime.
    /// </summary>
    public override void Load()
    {
        // Bindings...

        Bind<ICamaContext>().To<CamaContext>().InRequestScope();
        Bind<ICamaService>().To<CamaService>().InRequestScope();

    }
}
于 2012-09-19T19:19:29.927 に答える