1

ASP.NET MVC Web アプリで Ninject 2 を使用しています。すべての依存関係は、スタック (コントローラー -> サービス -> リポジトリー) で適切に処理されます。ただし、サービス プロジェクトには、アプリの起動時に挿入したい「チェーン」にないクラスがいくつかあります。Ninject にそれらを認識させるにはどうすればよいですか? 属性を持つパブリック プロパティがあり[Inject]ますが、アプリを実行すると null になります。私は何が欠けていますか?

ここに私の MvcApplication クラスがあります:

public class MvcApplication : NinjectHttpApplication
{
    protected override void OnApplicationStarted() {
        RegisterRoutes(RouteTable.Routes);
        RegisterAllControllersIn(Assembly.GetExecutingAssembly());
    }

    protected override IKernel CreateKernel() {
        var modules = new INinjectModule[] {
            new Services.ServiceModule(),
            new Data.DataModule()
        };

        var kernel = new StandardKernel(modules);

        return kernel;
    }

    // route registration removed
}

正しいバインディングが存在することを確認するために、両方のモジュールを再確認しました。

モジュールからのサンプル:

public class ServiceModule : NinjectModule
{
    public override void Load() {
        Bind<IAccountService>().To<AccountService>();
        ....
    }
}
4

2 に答える 2

2

Ninject が依存関係を注入するには、カーネルを使用してオブジェクトを作成する必要があります。これは、自然な依存関係チェーン (つまり、アプリ内のコントローラー -> サービス -> リポジトリー) 内のオブジェクトにとっては簡単ですが、それ以外のオブジェクトにとっては注意が必要です。

ナチュラル チェーンで作成された型のいずれかの依存関係として追加の型を追加するか、何らかの方法でカーネルにフックを取得して Get<T> を呼び出す必要があります。そのためには、静的サービス ロケーターを使用する必要がある場合があります。

于 2009-12-19T00:05:06.413 に答える
0

CreateKernel() をオーバーライドしていますか? あなたはそれを行い、そこでバインディングを行う必要があります。

于 2009-12-18T23:01:09.090 に答える