在 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>();