我不确定这如何适用于 Caliburn Micro,但由于问题是关于模式的,我将在这里描述我设法用StrucureMap解决这个问题的方法:使用Ctor<>
允许为构造函数参数解析指定具体类型的方法。
另外,我认为使用专用接口(您的FileTreeNavigation
示例)很棒,但是如果由于某种原因您认为这不合适,请继续阅读。
假设我们有INavigationService
接口和两个不同的实现:
public interface INavigationService { }
public class NavigationServiceA : INavigationService { }
public class NavigationServiceB : INavigationService { }
接下来,我们有两个不同的 Service 类,都依赖于INavigationService
接口:
public class ServiceA
{
private readonly INavigationService _navigationService;
public ServiceA(INavigationService navigationService)
{
_navigationService = navigationService;
}
}
public class ServiceB
{
private readonly INavigationService _navigationService;
public ServiceB(INavigationService navigationService)
{
_navigationService = navigationService;
}
}
最后,我们有一个将使用 IoC 容器解析的类。该类同时依赖于ServiceA
和ServiceB
,定义如下:
public class SomeClassToResolve
{
private readonly ServiceA _serviceA;
private readonly ServiceB _serviceB;
public SomeClassToResolve(ServiceA serviceA, ServiceB serviceB)
{
_serviceA = serviceA;
_serviceB = serviceB;
}
}
StructureMap 提供了指定使用什么类型来解析构造函数参数的可能性。这是注册的样子:
ForConcreteType<ServiceA>().Configure.Ctor<INavigationService>().Is<NavigationServiceA>();
ForConcreteType<ServiceB>().Configure.Ctor<INavigationService>().Is<NavigationServiceB>();
现在,当我调用container.GetInstance<SomeClassToResolve>();
它时,它将构造一个 的实例SomeClassToResolve
,该实例具有 的实例ServiceA
并ServiceB
正确构造(分别具有NavigationServiceA
和NavigationServiceB
)。
这是一种方法,我发现它更直接。也有可能进行Conditional Construction,但我认为这会变得非常复杂。
PS:搜索“caliburn 微构造函数”时,我偶然发现了这种方法,它看起来与我使用 StructureMap 所做的类似(只是这里称为InjectionConstructor
)。