MVC3のBasecontrollerのバインディングオブジェクトではないninject
-
30-09-2019 - |
質問
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つの修正があります。
- デフォルトのコンストラクターを削除します。これは、コンストラクターに注入を強制するため(ユニットテスト時に手動でコントローラーを作成する場合など)、すべてのサブクラスにコンストラクターを実装する必要があることです。
デフォルトのコンストラクターを保持しますが、追加します
[Inject
]すべての注射可能なプロパティへの属性:public BaseController : Controller { [Inject] public IMembershipService MembershipService { get;set; } // rest is the same }
Ninjectはこの方法でプロパティを正しく注入しますが、Ninjectがパラメーターのないコンストラクターを呼び出すことに注意してください。
他のヒント
Basecontrollerではなく、コントローラーからのホームコントローラーダービス?また、物事をnullとして設定するBasecontrollerのデフォルトのコンストラクターがあります。なぜあなたはそれを持っているのですか?これらのデフォルトのコンストラクターを取り除くことから始めます。デフォルトのコンストラクターは必要ないはずです。