が構成値である場合IsRuntimeFlag
(したがって、アプリケーションの存続期間中に変更することはできません)、次のように登録を行うことができます。
if (IsRuntimeFlag)
{
container.Register<I, A>();
}
else
{
container.Register<I, B>();
}
または同様に:
container.Register(typeof(I), IsRuntimeFlag ? typeof(A) : typeof(B));
アプリケーションの存続期間中に値が変更される可能性がある場合は、適切なインスタンスへのディスパッチを処理するプロキシまたはコンポジットが適切なソリューションです。
public sealed class RuntimeFlagIComposite : I
{
private readonly A a;
private readonly B b;
public RuntimeFlagIComposite(A a, B b) {
this.a = a;
this.b = b;
}
void I.Method() => this.Instance.Method();
private I Instance => IsRuntimeFlag ? this.a : this.b;
}
A
コンポジットはとに直接依存するため、B
次のように簡単に登録できます。
container.Register<I, RuntimeFlagIComposite>();
// Register A and B with their required lifestyles
container.Register<A>(Lifestyle.Singleton);
container.Register<B>(Lifestyle.Transient);
コンポジットを具体的な実装I
ではなく、抽象化自体に依存させることもできます。A
B
public class RuntimeFlagIComposite : I
{
private I a;
private I b;
public RuntimeFlagIComposite(I a, I b)
{
this.a = a;
this.b = b;
}
}
抽象化に応じて、I
このクラスはより柔軟でテストしやすくなります。ただし、少し異なる方法で登録する必要があることを意味します。これは、 を使用して実行できますRegisterConditional
。次に例を示します。
container.Register<I, RuntimeFlagIComposite>();
container.RegisterConditional<I, A>(c => c.Consumer.Target.Name == "a");
container.RegisterConditional<I, B>(c => c.Consumer.Target.Name == "b");