1

私は Ninject を学ぼうとしていて、非常に単純なことだと思ったことから始めました。それを機能させることはできません。明らかに、私は基本的なものを欠いています。

そこで、特定のポートで WCF 呼び出しをリッスンし、WCF 経由で受信したデータをデータベースに保存する、この小さなコンソール アプリケーションを用意しました。ソリューションには 3 つのプロジェクトがあります。1. データ アクセス ライブラリ、2. WCF のもの、3. ホストとして機能するコンソールです。Ninject はまだ使用されていません。したがって、プロジェクト間の依存関係は次のようになります: 3 -> 2 -> 1

コンソール ホストが構成からデータ アクセス ライブラリに取得する接続文字列を挿入することから始めたいと思います。接続文字列の ninjection をグーグル検索すると、いくつかの例が得られましたが、完全ではありません。

次のようにホストの Main() にバインドするよう提案された例の 1 つ:

static void Main(string[] args)
{
    new StandardKernel().Bind<ConnectionStringProvider>().ToConstant(
    new ConnectionStringProvider { ConnectionString = Config.ConnectionString });
}

ここで、ConnectionStrinProvider は、ConnectionString プロパティを 1 つだけ含む単純なクラスです。私が理解できないのは、データ アクセス ライブラリで ConnectionStrinProvider をインスタンス化する方法です。私は試した

var csprovider = new StandardKernel().Get<ConnectionStringProvider>();

機能しません。つまり、バインディング中に作成されたものではなく、プロバイダーの新しいインスタンスを返します。また、バインディングに .InSingletonScope() を追加しようとしましたが、同じ結果になりました。

4

2 に答える 2

2

設定したカーネルへの参照を保持する必要があります。毎回インスタンス化すると機能しません。

public static IKernel Ninject {get; private set;}
static void Main(string[] args)
{
    Ninject =  new StandardKernel()
    Ninject.Bind<ConnectionStringProvider>().ToConstant(
    new ConnectionStringProvider { ConnectionString = Config.ConnectionString });
}

Ninjectコンシューマー側では、メインの静的プロパティを呼び出すことができます。

明らかな注意はさておき、これはサンプルコードです。本番コードでは、そのグローバル静的変数の設計を改善したい場合があります。

于 2012-05-03T22:16:52.170 に答える
1

カーネルは、すべてのバインディングを追跡するものです。ただし、毎回新しいインスタンスを作成しています。それはうまくいきません。代わりに、カーネルを作成してから保存します(ここでは、ローカル変数に保存していますが、クラスのフィールドに保存することをお勧めします)。

var connectionStringProvider = new ConnectionStringProvider { ConnectionString = Config.ConnectionString };
var kernel = new StandardKernel().Bind<ConnectionStringProvider>().ToConstant(connectionStringProvider);

次に、既存のカーネルにアクセスしてインスタンスを取得します。

var csprovider = kernel.Get<ConnectionStringProvider>();

とはいえ、このパターンをサービスロケーターパターンと呼び、依存性注入のアンチテーゼであるため、この方法で使用するのは間違った方法です。一般的に、トップレベルのクラス(たとえば、Mainメソッドを持つアプリケーションクラス)があり、これはを介して取得されるか、を介してKernel.Get注入されます。Kernel.Inject他のすべての依存関係は、通常、コンストラクターまたは[Inject]'edプロパティを介して注入されます。

また、通常、ほとんどの状況で利用できるプラグインがあるため、カーネルを自分でインスタンス化する必要はありません。ただし、コンソールアプリ用のものは知りません。

于 2012-05-03T22:11:58.567 に答える