0

私の現在のスタックはASP.NETMVC4とEntityFramework5.0です。NuGetでninject.mvc3をインストールしましたが、以下に示すコードは正常に機能します。

public class SessionsController : Controller
{
    // use "kernel.Bind<MyContext>().ToSelf().InRequestScope();" 
    // to inject MyContext
    private MyContext _context;

    public SessionsController(MyContext context)
    {
        _context = context;
    }

    [HttpGet]
    public ActionResult Login()
    {
        System.Diagnostics.Debug.WriteLine(_context.Users.Count());
        return View();
    }
}

}

ここで、コントローラーのBaseControllerを抽出します。

public class BaseController : Controller
{
    protected MyContext _context;

    public BaseController(MyContext context)
    {
        _context = context;
    }

    // I don't know what should be write here and 
    // base controller must have a parameterless constructor
    public BaseController() 
    {

    }
}

次に、SessionsControllerをBaseControllerから継承させます。コードを実行すると、例外がスローされました

「オブジェクト参照がオブジェクトのインスタンスに設定されていません。(MyContextを使用)」

Ninjectを間違って使用しますか?

--更新--ninjectのNinjectWebCommon.csのコード

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

--更新-編集されたSessionsController.csコード

public class SessionsController : BaseController
{
    [HttpGet]
    public ActionResult Login()
    {
        System.Diagnostics.Debug.WriteLine(_context.Users.Count());
        return View();
    }
}

}

4

2 に答える 2

1

問題は Ninject または MVC ではありません。派生クラスにコンストラクターがありません。

コンストラクターはどのような方法でもポリモーフィックではないため (代わりに連鎖することしかできないため)、派生クラスで、 を受け取り、MyContextそれを基本コンストラクターに渡すコンストラクターを定義する必要があります。

public class SessionsController : BaseController
{
    public SessionsController(MyContext context) : base(context) { }

    [HttpGet]
    public ActionResult Login()
    {
        System.Diagnostics.Debug.WriteLine(_context.Users.Count());
        return View();
    }
}

例外が発生する理由は、クラスでコンストラクターを定義せず、基本クラスにパラメーターなしのコンストラクターがある場合、C# コンパイラーは base を呼び出すパラメーターなしのコンストラクターをクラスに自動的に挿入するためです。_context変数が設定されていなかったため、アクションが発生NullReferenceExceptionしていました。Login

于 2012-10-08T19:14:01.603 に答える
0

あなたがしていることをすることには、実際にはあまりメリットはありません。C# では、基本クラスでコンストラクターを使用する場合、派生クラスのコンストラクターを作成する必要があります。したがって、これを行う必要があります。

public class Derived : Base
{
    public Derived(MyContext context) : base(context) { }
}

ご覧のとおり、ベース コンテキストから派生させるのはほとんど同じくらいの作業です。標準プロセスを強制する以外。

基本コンストラクターを派生クラスから呼び出す方法を定義していないため、BaseController にはパラメーターなしのコンストラクターのみが必要です。

Ninject は基本クラスに魔法のようにパラメーターを挿入することはできません。派生クラスだけがそれを行うことができます。

于 2012-10-08T16:12:20.160 に答える