2

まず、Ninject2.0を使用しています

挿入したいマスターページがありますが、その方法がよくわかりません。私が試したのは、System.Web.Mvc.ViewMasterPageから派生するクラスを作成してから、プロパティを作成することです。

[Inject]
public ICacheService<List<Category>> Categories { get; set; }
[Inject]
public IConfigurationSettings Config { get; set; }

ページを実行すると、どちらのプロパティも設定されず、両方ともnullになります。理由についてのアイデアやこれを行う方法の例はありますか?ありがとう

- アップデート

それで、私はさらに調査を行いました。Ninjectはクラスの作成をインターセプトしないため、クラス内のオブジェクトを自分で解決する必要があるようです。だから今私の質問は、カーネルのリゾルバーをどのように作成するのですか?上記のコードはクラスライブラリ内にあるため、カーネルへの参照はありません。私は次のことを試しました:( http://www.codethinked.com/post/2009/10/07/Our-Biggest-Enemy-Isne28099t-Developers-Who-Refuse-To-Move-Forward-It-isから少し変更-開発者-Who-Pretend-To-Move-Forward.aspx

public class KernelResolver
{
    private static IKernel _kernel;

    public KernelResolver(IKernel kernel)
    {
        _kernel = kernel;
    }

    public static T Resolve<T>()
    {
        return _kernel.Get<T>();
    }
}

そして登録:

Bind<KernelResolver>().ToSelf()

それでもカーネルはnullです...いくつかの例を見る必要がありますが、何も見つかりません。または、混乱して何を探しているのかわからない可能性があります:\

どんな助けでも大歓迎です!

4

2 に答える 2

3

まず、質問します。マスターページに何かを挿入するのはなぜですか。MVCを使用している場合は、モデルを使用して、コントローラーを介してビュー(マスターページを含む)にデータを渡す必要があります。おそらく過度に単純化されているとすれば、それがMVCフレームワークの本質です。

Ninjectまたは他のIoCコンテナーでできることは、コントローラークラスを作成し、それらに依存関係を注入するのに役立ちます。実際、ASP.NetのIoCコンテナーの統合ポイントは、通常、コントローラーファクトリの責任を引き継ぎます。

コントローラに適切な依存関係を注入すると、コントローラがビュー(マスターページを含む)に渡す適切なモデルまたはモデルの状態を決定するのに役立つ場合があります。

私は、MVCパターン(さらに言えば、ASP.Net MVC)を、すべての意思決定(つまり制御)の責任をコントローラークラスに置くものと考えるのが好きです。コントローラーによって実行される決定は、多数の入力(構成、ユーザー入力、環境など)によって形成される場合がありますが、ある時点で、モデルがコントローラーによってビューに渡されます。システムの主題の状態を含むモデルを考えます。私の意見では、特にASP.Net MVCでのビューは、ロジックがなく、一部のオブジェクトモデルの真のクラスやファーストクラスの市民よりも「スクリプト」に似ていると見なすのが最適です。

ビューマスターページを「よりスマート」にする正当な理由があるかもしれませんが、通常、注入しようとしているものの種類は、コントローラーに注入され、必要なデータがビューに渡されます。あなたが成し遂げようとしていることについてもっと知りたいと思います。

注:NinjectとMVCの統合を簡単にセットアップして、すべてのコントローラーの依存関係を注入することができます。詳細については、このStackOverflowの質問/回答スレッドを確認してください。

于 2009-12-01T16:30:07.963 に答える
1

このKernelResolverクラスは、サービスロケーターパターンを実装します(依存関係について[中央]に何かを要求します)。これは、通常、主要なアプローチよりも最後の手段です。本当に必要なのは、依存性注入を機能させることです。

あなたは間違いなくBind KernelResolver何もしません-それは全体的なコンテナとして機能し、システム(例えば、MVCのファクトリ)はそれを助けるために接続する必要があります。

[Inject]属性はそれ自体では何の魔法も行いません。誰かがそのタイプのオブジェクトを注入するように要求したときに、Ninjectによって使用されます。

探しているのは、MVCに適切なタイミングでNinjectを呼び出すように指示する方法の例です。これを検索してみましょう(ninject "asp.net mvc"の例?)。

于 2009-12-01T09:12:33.933 に答える