使用适配器模式,结合 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 不在我的控制之下,并且它没有公共构造函数,因此使用了适配器。所以 Adaptee 被创建如下
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 的实例存在并且它有一个私有构造函数。
我应该使用拦截或其他东西来实现这一点吗?