我正在使用 Prism 和 DryIoc 容器开发 WPF 应用程序。 Prism 部分是唯一重要的部分。
假设我有一个接口(interface)和两个类,其中一个正在装饰另一个,它们依赖于另一个需要由容器解析的类型 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>(); // ?
}
最佳答案
How do I register this with IContainerRegistry so when I ask for an IA I get a B that's initialized with an A?
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>();
关于dependency-injection - 在 Prism 应用程序 DI 容器中注册装饰类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61762323/