使用回退注册通用接口

时间:2014-10-22 12:19:46

标签: generics dependency-injection castle-windsor

我想注册服务IInterface<T>,这样如果某个程序集中存在一个实现IInterface<T>的类,它会使用它,但如果该类不存在,则使用{{1} }}

所以,例如,假设我已经定义了一个类Fallback<T>

如果我问容器CatImplementer : IInterface<Cat>我会得到IInterface<Cat>。但是如果我要求CatImplementer,我会得到IInterface<Dog>,因为我没有创建一个实现Fallback<Dog>的类。

可以这样做吗?

1 个答案:

答案 0 :(得分:4)

根据您的示例,无论您是明确注册类型,都不需要做任何特殊的事情:

container.Register(Component.For(typeof(IInterface<Cat>)).ImplementedBy(typeof(CatImplementer)));
container.Register(Component.For(typeof(IInterface<>)).ImplementedBy(typeof(Fallback<>)));

或暗示:

container.Register(Classes.FromThisAssembly().Pick().WithServiceAllInterfaces());

在这两种情况下,以下代码:

IInterface<Cat> cat = container.Resolve<IInterface<Cat>>();
IInterface<Dog> dog = container.Resolve<IInterface<Dog>>();

Console.WriteLine("cat.GetType() -> " + cat.GetType());
Console.WriteLine("dog.GetType() -> " + dog.GetType());

使用这些对象时:

public interface IInterface<T> { }

public class CatImplementer : IInterface<Cat> { }

public class Fallback<T> : IInterface<T> { }

public class Cat { }

public class Dog { }

将打印:

cat.GetType() -> ConsoleApplication1.CatImplementer
dog.GetType() -> ConsoleApplication1.Fallback`1[ConsoleApplication4.Dog]

如果在您的实际使用案例中对您(使用Castle 3.3)不起作用,那么必须有一个不同的关键部分。如果是这种情况,请随意添加您的问题。