2012-08-09 58 views
0

我想弄清楚如何註冊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>()); 

但我寧願註冊的所有組件,如果有可能。

+0

我得到它有點反射的工作。我沒有手動掃描我的程序集,然後註冊了我用裝飾器找到的所有接口。 – mckn 2012-08-09 15:56:26

回答

0
container.Register(AllTypes.FromAssembly() 
         .BasedOn(typeof(ICalculate<>)) 
         .WithService.Base()); 

你試過這個嗎?我們有類似的情況,這對我們有效。

UPDATE

我不認爲這是可能的,因爲您將創建一個循環依賴。 我沒有得到它像以下工作:

註冊

var container = new WindsorContainer(); 


     container.Register(Component.For(typeof(IDecorator<>)).ImplementedBy(typeof(CalculatorDecorator<>))); 

     container.Register(AllTypes.FromThisAssembly() 
           .BasedOn(typeof (ICalculate<>)) 
           .WithService.Base()); 



     var fc = container.Resolve<IDecorator<Foo>>(); 
     var bc = container.Resolve<IDecorator<Bar>>(); 

接口:

public interface ICalculate<T> where T : class 
{ 
    void Calculate(T value); 
} 

public interface IDecorator<T> : ICalculate<T> where T : class 
{ 

} 

實現:

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>: IDecorator<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); 
    } 
} 
+0

我無法得到那個工作。當我請求ICalculate 時,它仍然解決了BarCalculator問題。我認爲AllTypes與註冊API中的類相同。 – mckn 2012-08-09 13:47:05

+0

我也無法使它工作。有沒有人能夠實現這一目標? – Bredstik 2014-11-20 01:33:14