0

次のデコレータ シナリオをキャッスル ウィンザーに登録する方法を見つけようとしています。私は次のインターフェースを持っています:

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>());

しかし、可能であれば、すべてのコンポーネントを登録したいと思います。

4

1 に答える 1

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

これを試しましたか?同様の状況があり、これがうまくいきました。

アップデート

循環依存関係を作成するため、これは不可能だと思います。私は次のように動作しました:

登録

 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);
    }
}
于 2012-08-09T13:35:49.243 に答える