我想弄清楚如何註冊Castle Windsor的以下裝飾器場景。我有以下接口:溫莎的通用裝飾器
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());
當我要求通過通用接口我想溫莎,以解決在構造函數中注入的要求執行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>());
但我寧願註冊的所有組件,如果有可能。
我得到它有點反射的工作。我沒有手動掃描我的程序集,然後註冊了我用裝飾器找到的所有接口。 – mckn 2012-08-09 15:56:26