これが Caliburn Micro にどのように当てはまるかはわかりませんが、質問はパターンに関するものなので、StrucureMapでこの問題を解決する方法をここで説明します:Ctor<>
コンストラクターのパラメーター解決に具体的な型を指定できる方法を使用します。
また、特殊なインターフェース(あなたのFileTreeNavigation
例)を使用することは素晴らしいと思いますが、何らかの理由でこれが適切でないと思う場合は、読み進めてください.
INavigationService
インターフェイスと 2 つの異なる実装があるとします。
public interface INavigationService { }
public class NavigationServiceA : INavigationService { }
public class NavigationServiceB : INavigationService { }
次に、INavigationService
インターフェイスに応じて、2 つの異なる Service クラスがあります。
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
これはそれを行う1つの方法であり、より簡単であることがわかりました。Conditional Constructionを実行する可能性もありますが、かなり複雑になる可能性があると思います。
PS:「caliburn micro constructor」を検索すると、StructureMapで行っていることに似ているこのアプローチInjectionConstructor
に出くわしました(ここでは と呼ばれているだけです)。