インターフェイスの複数の実装があり、それぞれに異なるインターセプターを適用したい。
public interface IFoo { int Run(); }
public class Foo1 : IFoo
{
public int Run() { return 1; }
}
public class Foo2 : IFoo
{
public int Run() { return 2; }
}
インターセプターの例:
public class MultiplyBy10 : IInterceptor
{
public void Intercept(IInvocation invocation)
{
invocation.Proceed();
invocation.ReturnValue = (int)invocation.ReturnValue * 10;
}
}
public class MultiplyBy100: IInterceptor
{
public void Intercept(IInvocation invocation)
{
invocation.Proceed();
invocation.ReturnValue = (int)invocation.ReturnValue * 100;
}
}
バインディング:
var kernel = new StandardKernel();
kernel.Bind<IFoo>().To<Foo1>().Named("1");
kernel.Bind<IFoo>().To<Foo2>().Named("2");
kernel.Intercept(ctx => ctx.Plan.Type == typeof(Foo1)).With<MultiplyBy10>();
kernel.Intercept(ctx => ctx.Plan.Type == typeof(Foo2)).With<MultiplyBy100>();
Foo1 が 10 倍され、Foo2 が 100 倍されることを期待しています。しかし、代わりに両方とも 10 倍されます。
var foo1 = kernel.Get<IFoo>(ctx => ctx.Name == "1");
var foo2 = kernel.Get<IFoo>(ctx => ctx.Name == "2");
Assert.That(foo1.Run(), Is.EqualTo(10));
// fails: returns 20
Assert.That(foo2.Run(), Is.EqualTo(200));
これはバグですか、それとも何か間違っていますか?