1

ASP.NET MVC Web アプリケーションを開発しています。すべてを抽象化した優れたデータ層を構築したかったのです。優れたデータ レイヤーのように、コントローラーはデータベースと直接やり取りしません。

もちろん、データ層の内部には、データベースと通信するために必要なものがたくさんあります。これらすべてのオブジェクトが同じデータ コンテキストを使用することを望みます (これは Linq2SQL を使用していますが、それはあまり重要ではないと考えています)。はい、これはリポジトリまたは作業パターンのように聞こえます。私がほとんどの場合、作業単位の部分を実装しているだけであることを除いて、それは一種です。

さて、私の問題は、それを必要とするすべてのクラスにデータ コンテキストを取得する方法です。Ninject は必要な場所に注入できると思っていました。そして、私が構築しているオブジェクトのコンストラクターにパラメーターが1つしかない場合はそうです。

したがって、これはうまくいくようです:

public class InjectedFoo
{
     InjectedFoo(IInjectable ii) {/*stuff*/}
}

ただし、これによりコンパイラエラーが発生します。

public class InjectedFoo
{
     InjectedFoo(Object stuff, IInjectable ii) {/*stuff*/}
}

はい、これは完全に理にかなっています。結局、コンパイラは、Ninject がその 2 番目のパラメーターを作成することを知りません。しかし同時に、たった 1 つのパラメータで Ninject がそれを理解します...これがポイントのように思えます。では、これらの 2 つのパラメーターを使用してどうすればよいでしょうか。

では、少し賭け金を上げてみましょう。

public static class FooFactory
{
    public static MakeFoo(int fooID, IInjectable ii)
    {
    }
}

そのため、実際にインスタンス化することなく、クラスで既存のデータ コンテキストを使用する必要があります。そして、必要なオブジェクトの ID を渡す必要があります。もちろん、2番目のパラメーターが渡されないという同じ問題があるため、コンパイラーは文句を言いますが、非静的プロパティを持つことができないため、プロパティ注入を使用することさえできません。(静的プロパティを使用できることは知っていますが、安全かどうかはわかりません。)

そのため、Ninject を間違って使用しているか、これを処理するものを単純に見逃しているように感じます。残念ながら、すべてのドキュメントと例は、非常に単純な1引数のコンストラクターに焦点を当てているようです...

4

0 に答える 0