我正在使用Prism和DryIoc容器制作一个WPF应用程序。 Prism部分是唯一应该关注的东西。
比方说,我有一个接口和两个类,其中一个在装饰另一个,它们依赖于另一个需要由容器解析的类型ID。
public interface IA {
void Method();
}
public class A : IA {
public A(ID d) { ... }
public void Method() { ... }
}
public class B : IA {
public B(ID d, IA a) { ... }
public void Method() { ... }
}
我如何在IContainerRegistry中注册,以便当我要求一个IA时,我得到一个用A初始化的B?
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.Register<ID, D>();
containerRegistry.Register<IA, A>();
containerRegistry.Register<IA, B>(); // ?
}
我如何用IContainerRegistry注册这个,以便当我要求一个IA时,我得到一个用A初始化的B?
containerRegistry.Register<ID, D>();
containerRegistry.Register<IA>( c => new B( c.Resolve<ID>(), c.Resolve<A>() ) );
是的,这很丑陋,也很脆弱。因此,我会重新审视架构,并使用通用性来定义装饰类型。
public class B<DecoratedType> : IA where DecoratedType : IA
{
public B( ID d, DecoratedType a )
{
...
}
}
和
containerRegistry.Register<IA,B<A>>();
声明:我是unity背景的,unity解析具体类型不用注册。如果DryIOC不这样做,你必须添加
containerRegistry.Register<A>();