我想注册服务IInterface<T>
,这样如果某个程序集中存在一个实现IInterface<T>
的类,它会使用它,但如果该类不存在,则使用{{1} }}
所以,例如,假设我已经定义了一个类Fallback<T>
。
如果我问容器CatImplementer : IInterface<Cat>
我会得到IInterface<Cat>
。但是如果我要求CatImplementer
,我会得到IInterface<Dog>
,因为我没有创建一个实现Fallback<Dog>
的类。
可以这样做吗?
答案 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)不起作用,那么必须有一个不同的关键部分。如果是这种情况,请随意添加您的问题。