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; }
}
問題は、アダプティーが私の管理下になく、パブリック コンストラクターがないため、アダプターを使用することです。したがって、Adapte は次のように作成されます。
Adaptee adaptee = Adaptee.New();
adaptee.MyProperty = 5;
実際のコードでは、上記のコードは外部で制御されたアセンブリで実行され、次のコードに渡されます。
using (UnityContainer container = new UnityContainer())
{
container
.RegisterType<MyTestClass>(
new InjectionProperty("MyTarget"));
container.RegisterInstance<Adaptee>(adaptee, new ExternallyControlledLifetimeManager());
MyTestClass myTestClass = container.Resolve<MyTestClass>();
}
コードを実行すると、次のようになります。
Debug.Assert(myTestClass != null);
Debug.Assert(myTestClass.MyTarget != null);
Debug.Assert(myTestClass.MyTarget.MyProperty == adaptee.MyProperty);
これは、解決された Adapter のインスタンスを myTestClass インスタンスの MyTarget プロパティに挿入する必要があることを意味します。Adapter のインスタンスは、外部で作成された Adaptee のインスタンスで作成されているはずです。
次のコード:
container
.RegisterType<MyTestClass>(
new InjectionProperty("MyTarget"));
実際には次のようになります。
container
.RegisterType<MyTestClass>(
new InjectionProperty("MyTarget", container.Resolve<Adapter>()));
Adapter のインスタンスがまだ存在せず、プライベート コンストラクターがあるため、これは可能ではないようです。
これを達成するために傍受などを使用する必要がありますか?