5

電卓:のStructureMap:ネストされた依存関係の具体的な種類を選択してください

public interface ICalculator 
{ 
    int Calculate(int a, int b); 
} 

public class Calculator : ICalculator 
{ 
    private readonly ICalculatorStrategy _calculatorStrategy; 

    public Calculator(ICalculatorStrategy calculatorStrategy) 
    { 
     _calculatorStrategy = calculatorStrategy; 
    } 

    public int Calculate(int a, int b) 
    { 
     return _calculatorStrategy.Calculate(a, b); 
    } 
} 

電卓stragies:

public interface ICalculatorStrategy 
{ 
    int Calculate(int a, int b); 
} 

public class AdditionCalculator : ICalculatorStrategy 
{ 
    public int Calculate(int a, int b) 
    { 
     return a + b; 
    } 
} 

public class MultiplyCalculator : ICalculatorStrategy 
{ 
    public int Calculate(int a, int b) 
    { 
     return a * b; 
    } 
} 

電卓の使用法:

public class CalculatorUsageOne 
{ 
    private readonly ICalculator _calculator; 

    public CalculatorUsageOne(ICalculator calculator) 
    { 
     _calculator = calculator; 
    } 

    public void Process() 
    { 
     Console.WriteLine(_calculator.Calculate(6, 5)); 
    } 
} 

public class CalculatorUsageTwo 
{ 
    private readonly ICalculator _calculator; 

    public CalculatorUsageTwo(ICalculator calculator) 
    { 
     _calculator = calculator; 
    } 

    public void Process() 
    { 
     Console.WriteLine(_calculator.Calculate(6, 5)); 
    } 
} 

のStructureMapレジストリ:

public class DependencyRegistry : Registry 
{ 
    public DependencyRegistry() 
    { 
     For<ICalculatorStrategy>().Use<AdditionCalculator>().Named("Addition"); 
     For<ICalculatorStrategy>().Use<MultiplyCalculator>().Named("Multiply"); 
     For<ICalculator>().Use<Calculator.Calculator>(); 
    } 
} 

CalculatorUsageOneの場合は、番号を追加したい(AdditionCalculator)。 CalculatorUsageTwoの場合は、数値を掛けたい(MultiplyCalculator)。

どのようにStructureMapでこれを達成できますか?

答えて

4

は次のように試してみてください。とにかく、より明確な方法で依存関係を表示するためにここでジェネリックを使用することについて考えます。ジェネリック医薬品について

編集:

ジェネリックを使用すると、ここには良いアイデアであるかどうか、あなたのシナリオから依存しています。 CalculatorUsagesの具体的な依存関係を意図的に指定しておらず、それを戦略にとらわれないようにすることがあなたの目標である場合、あなたのソリューションは最高のようです。

しかし、 "中間層"の共通実装をCalculatorにするだけであれば、Calculatorのジェネリックパラメータの依存関係を明示的に指定することができます。多分それはここで最高のユースケースはないが、それはこのように何とか行くことができます。これは、要求されたICalculatorのための任意の一般的なパラメータを渡すためのStructureMapを教えてくれます

For(typeof(ICalculator<>).Use(typeof(Calculator<>); 

public class CalculatorUsageOne 
{ 
    public CalculatorUsageOne(ICalculator<AdditionCalculator> calculator) 
    { 
     // ... 
    } 
} 

public class Calculator<T> where T : ICalculatorStrategy 
{ 
    public Calculator(T strategy) 
    { 
     // ... 
    } 
} 

とこのようにそれを登録しますCalculatoropen generics)であり、コンストラクタでストラテジオブジェクトをインスタンス化します。

また、ジェネリックスの代わりにmarker interfacesを使用することもできますが、それはすべてあなたの特定のシナリオに依存しており、最も簡単な解決策が最善のものである可能性があります。

+0

@A。 「とにかく、ここでジェネリックを使って依存関係をより明示的に表示することを考えます。これはどうやって見えますか? – Rookian

+0

@Rookian、私はジェネリックについてのいくつかの考えで私の答えを編集しました。 – NOtherDev

+0

@A。 ICalulator をどうすればテストできますか?それはまったく可能ですか、それとも私がそれをどうやって偽造しますか? – Rookian

1

1つの方法は、Withメソッドを使用してインスタンスを取得するときの依存関係を定義することです。

私が考えることができる唯一の他の方法は、型を登録するときにコンストラクタ引数としてisntanceを提供することです。私は明日の例を提供することができます。

For<CalculatorUsageOne>().Use<CalculatorUsageOne>() 
    .Ctor<ICalculator>().Is<Calculator.Calculator>(
     x => x.Ctor<ICalculatorStrategy>().Is<AdditionCalculator>() 
    ); 
For<CalculatorUsageTwo>().Use<CalculatorUsageTwo>() 
    .Ctor<ICalculator>().Is<Calculator.Calculator>(
     x => x.Ctor<ICalculatorStrategy>().Is<MultiplyCalculator>() 
    ); 

あなたはあなたが必要とするほど深い巣あなたのオブジェクトグラフの設定を行うことができます

関連する問題