我不知道如何适用于卡利微,但由于问题是关于模式,我将在这里描述我设法用StrucureMap解决这个问题的方法:使用Ctor<>
方法,它允许指定具体类型的构造参数分辨率。你的01例如)非常棒,但如果由于某种原因,您认为不合适,请继续阅读。
让我们假设我们有INavigationService
接口和两个不同的实现:
public interface INavigationService { }
public class NavigationServiceA : INavigationService { }
public class NavigationServiceB : INavigationService { }
接下来,我们有两个不同的服务等级,既取决于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:搜索“卡利微构造”我偶然发现this approach这似乎类似于我与StructureMap(只有在这里,它被称为InjectionConstructor
)做的事情。
您使用的是什么DI库? – GolfWolf
@ w0lf:容器是Caliburn.Micro的一部分(http://caliburnmicro.codeplex.com/SourceControl/changeset/view/3cc9a20b8554#src%2fCaliburn.Micro.WP71.Extensions%2fSimpleContainer.cs) – skarmats