3

私は一般的に Ninject と Dependency Injection を初めて使用するので、ここで私の初心者を許してください。=)

IConfigインターフェイスを実装する型のアセンブリとその依存関係をスキャンするインターフェイスの実装がいくつかありIConfigOptionます。各IConfig実装は、異なるソースから値を取得します。

これらの実装は、スキャンを開始する場所からルート アセンブリをコンストラクターの引数として受け取ります。私は、これらの値を挿入するバインディングを考え出そうとしています。これまでのところ、次の行で何かを考えています。

Bind<IConfig>().To<Config>().WithConstructorArgument("rootAssembly", target);

私の問題は、クラスが注入されるtargetアセンブリへの参照を取得する方法が見つからないように見えることです。ConfigDI を使用しない場合は を使用Assembly.GetCallingAssembly()しますが、このコンテキストでは、必要なターゲット アセンブリではなく、バインディングが存在するアセンブリが生成されます。

また、インジェクションを受け取るクラス/メンバーから目的の実装を指定する方法が必要です。たとえば、クライアント クラス A は をConfig使用する実装者をRoleEnvironment要求し、クライアント クラス B は をConfig使用する実装者を要求しますConfigurationManager。使用目的を明確にするための例を次に示します。

public class Client
{
    [UseApplicationConfig]
    public IHelper WithAppConfig { get; set; }

    [UseRoleEnvironmentConfig]
    public IHelper WithRoleEnvironmentConfig { get; set; }
}

public class Helper : IHelper
{
    public Helper(IConfig config)
    {
    }
}

これを間違った角度から見ているか、明白なものを見逃しているように感じますが、何を探すべきかわかりません。どのように行うのが最善の方法でしょうか?

どうもありがとうございました。

編集:意図した使用例を追加し、明確にするために質問の一部を言い換えました。

4

1 に答える 1

1

オブジェクトに対して行われているリクエストの詳細を取得する場合は、オーバーロードを使用しますWithConstructorArgument(string, Func<IContext, object>)。提供されている を使用IContextしてアセンブリ名を探すことができます (デバッガーを使用して見回してください。レイアウトが非常に複雑なように思われるため、特定のコードを提供することはできません)。

これを使用する方法の例として:

//get the full name of the requested object
Bind<IFoo>()
    .To<Foo>()
    .WithConstructorArgument("bar",
                             c => c.Request.FullName);

しかし、あなたはそれを間違った角度から見ているように思えます。あなたの質問を正しく読むと、Ninject に任せるのではなく、アセンブリをスキャンして何を注入するかを決定するクラスがあるように思えます。これは、DI を使用していなかったときの残り物ではないでしょうか。

WhenInjectedIntoメソッドまたはカスタム属性でコンテキストバインディングを使用して、必要な特定のIHelperものをコンストラクターに挿入することを検討します。ここを参照してください: https://github.com/ninject/ninject/wiki/Contextual-Binding

リンクされたページには、実際にあなたのために働くかもしれない同様のことをする例があります:

Bind<IWarrior>()
    .To<Samurai>()
    .When(request => request.Target.Type.Namespace.StartsWith("Samurais.Climbing"));

ただし、後で名前空間をリファクタリングする場合に備えて、「魔法の文字列」はありませWhenInjectedIntoん。

于 2012-07-04T19:15:23.030 に答える