2

子クラスのコンストラクターにコンストラクター引数を渡す方法を見つけようとしています。これらのオブジェクトは不変であるため、コンストラクター引数を使用することをお勧めします。

私が遭遇した問題は、ConstructorArgument が子のインスタンス化を継承せず、次のステートメントが交換できないことです。

_parsingProcessor = _kernel.Get<IParsingProcessor>(new ConstructorArgument("dataFilePath", dataFilePath);

_parsingProcessor = _kernel.Get<IParsingProcessor>(new Parameter("dataFilePath", dataFilePath, true);

では、継承可能な ConstructorArgument を取得するにはどうすればよいでしょうか。また、Parameter クラスを新しくすることが理にかなっているのはいつでしょうか?

4

1 に答える 1

3

はい、これを行うことができますが、それはおそらくあなたが本当に望んでいるものではありません. コンテナーが実際に自身の依存関係をインスタンス化する責任を負わない場合、その依存関係はおそらくそのコンストラクター引数を共有すべきではありません - それは単に意味がありません。

私はあなたが何をしようとしているのかを知っていると確信しています。推奨されるアプローチは、WhenInjectedInto以下の例のように、1 つのコンテナー専用の一意のバインディングを作成し、条件付きバインディング構文を使用することです。

public class Hello : IHello
{
    private readonly string name;

    public Hello(string name)
    {
        this.name = name;
    }

    public void SayHello()
    {
        Console.WriteLine("Hello, {0}!", name);
    }
}

これは、誰がIHello. この退屈なコンテナ クラスだとしましょう。

public class MyApp : IApp
{
    private readonly IHello hello;

    public MyApp(IHello hello)
    {
        this.hello = hello;
    }

    public virtual void Run()
    {
        hello.SayHello();
        Console.ReadLine();
    }
}

さて、バインディングを行う方法は次のとおりです。

public class MainModule : NinjectModule
{
    public override void Load()
    {
        Bind<IApp>().To<MyApp>();
        Bind<IHello>().To<Hello>()
            .WithConstructorArgument("name", "Jim");
        Bind<IHello>().To<Hello>()
            .WhenInjectedInto<MyApp>()
            .WithConstructorArgument("name", "Bob");
    }
}

基本的に、このバインディングが行っていることは、によって要求されていない限りname、は "Jim" であるべきだと言っているだけです。この場合はそうなので、代わりに "Bob" という名前を取得します。Hello


本当にカスケード動作が必要であり、これが非常に危険で脆弱であることを理解している場合は、メソッドバインディングを使用してごまかすことができます。特定されていない目的のためにクラスに引数を追加したと仮定すると、バインディングは次のようになります。nameMyApp

Bind<IHello>().ToMethod(ctx =>
    ctx.Kernel.Get<Hello>(ctx.Request.ParentContext.Parameters
        .OfType<ConstructorArgument>()
        .Where(c => c.Name == "name")
        .First()));

お願いします、お願いします、それをする前に、これがあなたが望むものであるということを確信してください。簡単に見えますが、単純なリファクタリング中に壊れる可能性が非常に高く、私が見た「カスタマイズされた依存関係」シナリオの 95% は、WhenInjectedInto代わりにバインディングを使用して対処できます。

于 2011-08-14T21:12:36.473 に答える