在Prism应用DI容器中注册装饰类型。

问题描述 投票:0回答:1

我正在使用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>(); // ?
}
dependency-injection prism decorator ioc-container
1个回答
1
投票

我如何用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>();
© www.soinside.com 2019 - 2024. All rights reserved.