質問

MVC2プロジェクトをMVC3にアップグレードし、NUGETライブラリパッケージリファレンスを使用してNinjectをインストールしました。これにより、AppStartクラスが作成され、次のコードを使用してImeMberShipServiceクラスを挿入しました。

public static void RegisterServices(IKernel kernel) {
        kernel.Bind<IMembershipService>().To<AccountMembershipService>();
    }

これは、たとえば、私のHomeControllerでうまく機能します。

public class HomeController : Controller
{
    public IMembershipService MembershipService { get; set; }

    public HomeController() : this(null) { }

    public HomeController(IMembershipService service)
    {
        MembershipService = service;
    }

ただし、Basecontrollerを使用しています。基本クラスのほぼ同じコードが機能しなくなりました。

public class BaseController : Controller
{
    public IMembershipService MembershipService { get; set; }
    public UserService UserService { get; set; }

    public BaseController() : this(null, null) { }

    public BaseController(IMembershipService service, UserService userService)
    {
        MembershipService = service;
        UserService = userService ?? new UserService();
    }

ベースコントローラーのコンストラクターを破ると、サービスはただnullです。私はIOCにninjectを使用したことがないので、おそらく答えは明らかですが、なぜ私が望むように基本クラスに私のaccountmembershipcontrollerを注入しないのですか?何が違うのかわかりませんが、余分なレベルの継承が何らかの形でニッケージをいじっている可能性があることに気付きました。

役に立ちましたか?

解決

私は自分で同じ問題に遭遇しました。あなたのコードが次のように見えると仮定すると:

public HomeController : BaseController
{

}

public BaseController : Controller
{
    public IMembershipService MembershipService { get; set; }

    public MembershipService() { }

    public MembershipService(IMembershipService service)
    {
        MembershipService = service;
    }
}

何らかの理由で、 ninject それを考えます HomeController デフォルトのパラメーターレスであるコンストラクターが1つしかありません。あなたがすべてに置くとき HomeController, 、注射可能なコンストラクターを見つけることができますが、それを基本クラスに排除し、何らかの理由で、過負荷のあるコンストラクターがあるかどうかを確認するために基本クラスを探しません。これには2つの修正があります。

  1. デフォルトのコンストラクターを削除します。これは、コンストラクターに注入を強制するため(ユニットテスト時に手動でコントローラーを作成する場合など)、すべてのサブクラスにコンストラクターを実装する必要があることです。
  2. デフォルトのコンストラクターを保持しますが、追加します [Inject]すべての注射可能なプロパティへの属性:

    public BaseController : Controller
    {
        [Inject] public IMembershipService MembershipService { get;set; }
        // rest is the same
    }
    

Ninjectはこの方法でプロパティを正しく注入しますが、Ninjectがパラメーターのないコンストラクターを呼び出すことに注意してください。

他のヒント

Basecontrollerではなく、コントローラーからのホームコントローラーダービス?また、物事をnullとして設定するBasecontrollerのデフォルトのコンストラクターがあります。なぜあなたはそれを持っているのですか?これらのデフォルトのコンストラクターを取り除くことから始めます。デフォルトのコンストラクターは必要ないはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top