アダプターパターンを使用してIoC(具体的にはUnity)と組み合わせると、プロパティーがアダプターのプロティティーを指すオブジェクトの新しいインスタンスを作成します(基本的にターゲットオブジェクトに適応する)。パブリックコンストラクタを持たない外部生成オブジェクトインスタンスの解決
私は以下のクラス構造を持つ例として:
public class Adaptee
{
private Adaptee() { }
public int MyProperty { get; set; }
public static Adaptee New()
{
return new Adaptee();
}
}
public class Target
{
public int MyProperty { get; set; }
}
public class Adapter : Target
{
public Adapter(Adaptee adaptee)
{
this.MyProperty = adaptee.MyProperty;
}
}
public class MyTestClass
{
public Target MyTarget { get; set; }
}
問題はAdapteeは私の管理下にはなく、それは公共のコンストラクタ、アダプタの故に使用を持っていないということです。私はの実行を希望
using (UnityContainer container = new UnityContainer())
{
container
.RegisterType<MyTestClass>(
new InjectionProperty("MyTarget"));
container.RegisterInstance<Adaptee>(adaptee, new ExternallyControlledLifetimeManager());
MyTestClass myTestClass = container.Resolve<MyTestClass>();
}
:だからAdapteeは、実際のコード上記のコードは、外部から制御アセンブリ内で実行し、次のコードに渡されるで
Adaptee adaptee = Adaptee.New();
adaptee.MyProperty = 5;
に従って作成されます以下もたらすためのコード:
Debug.Assert(myTestClass != null);
Debug.Assert(myTestClass.MyTarget != null);
Debug.Assert(myTestClass.MyTarget.MyProperty == adaptee.MyProperty);
これはアダプタの分解インスタンスはmyTestClassインスタンスのMyTargetプロパティに注入されなければならないことを意味します。アダプタのインスタンスは、外部で作成されたAdapteeのインスタンスで作成されている必要があります。
次のコード:
container
.RegisterType<MyTestClass>(
new InjectionProperty("MyTarget"));
が実際にこの生じるはずである:
container
.RegisterType<MyTestClass>(
new InjectionProperty("MyTarget", container.Resolve<Adapter>()));
にアダプターのインスタンスがまだ存在しません、それはプライベートなコンストラクタを持っているので、これは可能ではないようです。
これを達成するために傍受または何かを使うべきですか?
だから、それは二重Dohです!瞬間 上記のコードは機能しますが、必ずしも理想的ではありません。ターゲットタイプは常にアダプタタイプに解決されるべきではありません。この場合は、MyTestClassのMyTargetプロパティに対してインジェクションが発生した場合にのみアダプタに解決されます。 – Schalk