dependency-injection - 在 Prism 应用程序 DI 容器中注册装饰类型

标签 dependency-injection prism decorator ioc-container

我正在使用 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/

相关文章:

c# - 使用依赖注入(inject)处理对象

android - 如何在 Kotlin 中注入(inject)原始变量?

python - 在 Python 2.7 中定义类似 "property"的装饰器

python - 从装饰器访问拥有装饰方法的类

android - koin 中的 Dagger2 Provider

c# - 将具有通用和具体实现的存储库注入(inject) Controller

c# - Xamarin Forms - Prism - OnNavigatedTo 调用两次

c# - Prism MVVM,我应该将 IRegionManager 放在 ViewModel 中还是其他地方?

c# - 使用静态 TabItem 将集合绑定(bind)到 WPF TabControl

javascript - javascript 装饰器中的目标缺少其属性