次のデコレータ シナリオをキャッスル ウィンザーに登録する方法を見つけようとしています。私は次のインターフェースを持っています:
public interface ICalculate<T> where T : class
{
void Calculate(T value);
}
そして、最後の実装がデコレータであるいくつかの実装。
public class FooCalculator : ICalculate<Foo>
{
public void Calculate(Foo value)
{
// do something here with the value..
}
}
public class BarCalculator : ICalculate<Bar>
{
public void Calculate(Bar value)
{
// do something else here....
}
}
public class CalculatorDecorator<T> : ICalculate<T> where T : class
{
private readonly ICalculate<T> _calculator;
public CalculatorDecorator(ICalculate<T> calculator)
{
_calculator = calculator;
}
public void Calculate(T value)
{
// do for example some logging...
_calculator.Calculate(value);
}
}
これは私の登録コードです
container.Register(Classes.FromAssembly()
.BasedOn(typeof(ICalculate<>))
.WithService.Base());
ジェネリック インターフェイスで実装の 1 つを要求すると、コンストラクターに挿入された要求された実装で Windsor に CalculatorDecorator を解決してもらいます。
// I would like calculator to be CalculatorDecorator<Foo> in
// this case but it is FooCalculator.
var calculator = container.Resolve<ICalculate<Foo>>();
// The same goes for this one...
var calculator = containr.Resolve<ICalculate<Bar>>();
前もって感謝します!
編集:
私がこのようにすればうまくいく
container.Register(Component.For<ICalculate<Foo>>()
.ImplementedBy<CalculatorDecorator<Foo>>(),
Component.For<ICalculate<Foo>>()
.ImplementedBy<FooCalculator>());
container.Register(Component.For<ICalculate<Bar>>()
.ImplementedBy<CalculatorDecorator<Bar>>(),
Component.For<ICalculate<Bar>>()
.ImplementedBy<BarCalculator>());
しかし、可能であれば、すべてのコンポーネントを登録したいと思います。