5

コンストラクター引数としてインターフェースを取るクラスがあります。このインターフェイスには2つの実装があり、変数に基づいて実行時に使用する実装を決定したいと思います。

問題は、上記のクラスがAutofacによって解決されるオブジェクト階層の奥深くにあるため、引数を渡すことができないことです。

以下のようなものが私が達成しようとしていることです。

public interface IInterface1 {}
public interface IInterface2 {}

public class Class1 : IInterface2
{
    public Class1(IInterface1 interface1)
    {
    }
}

public class Class2
{
    public Class2(IInterface2 interface2)
    {
    }
}

public class Class3
{
    public void GetClass2Instance(string interface1ImplementationToChoose)
    {
        // want to change which implementation of IInterface1 is resolved based on the interface1ImplementationToChoose variable
        var class2 = container.Resolve<Class2>();
    }
}

何か案は?

アップデート:

明確にするために、これは正常に動作する既存のアプリケーションによって使用される既存のオブジェクト階層です。また、オブジェクトモデルは、この例に示されているものよりもはるかに大きくなっています。結果として、オブジェクトグラフの各コンストラクターにファクトリを渡して、そのグラフの深いクラスで使用する必要はありません。

Class2がそれについて何も知らずにIInterface1の別の実装をClass1に渡す方法はありますか?

ありがとう

4

1 に答える 1

6

はい、型の選択方法を隠すファクトリを注入します。

public class Class3
{
   private Func<string, Class2> _class2Factory;
   public Class3(Func<string, Class2> class2Factory)
   {
        _class2Factory = class2Factory;
   }

   public void GetClass2Instance(string interface1ImplementationToChoose)
   {
       var class2 = _class2Factory(interface1ImplementationToChoose);
   }
}

そして、コンテナのセットアップ、次の行に沿ったもの:

builder.RegisterType<Implementation1>().Named("imp1").As<IInterface1>();
builder.RegisterType<Implementation2>().Named("imp2").As<IInterface1>();
builder.Register<Func<string, Class2>>(c => 
    {
        var context = c.Resolve<IComponentContext>();
        return imp => new Class2(context.Resolve<IInterface1>(imp));
    });
builder.RegisterType<Class3>();

次のように使用できるClass3ようになりました。

public class Class4
{
     public Class4(Class3 class3)
     {
         var class2with1 = class3.GetClass2Instance("imp1");
         var class2with2 = class3.GetClass2Instance("imp2");
     }
}

注:Class2同じインターフェースのさまざまな実装を注入する必要があることを意味していると思いましたIInterface1。異なるインターフェイスを実装する 2 つのクラスを示しているため、サンプルは少し混乱しています。

于 2010-08-04T21:45:14.660 に答える