在 Prism 应用程序 DI 容器中注册装饰类型
Registering a decorated type in a Prism app DI container
我正在使用带有 DryIoc 容器的 Prism 开发 WPF 应用程序。棱镜部分是唯一重要的部分。
假设我有一个接口和两个 类,其中一个正在装饰另一个,它们依赖于另一个需要由容器解析的类型 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>();
我正在使用带有 DryIoc 容器的 Prism 开发 WPF 应用程序。棱镜部分是唯一重要的部分。
假设我有一个接口和两个 类,其中一个正在装饰另一个,它们依赖于另一个需要由容器解析的类型 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>();