Castle Windsor
不支持这样的事情,但是你可以用一个简单的辅助方法,实现它:
public static void RegisterAccordingToISuperType<T>(this IWindsorContainer container)
{
if (typeof (T).GetInterfaces().Contains(typeof (ISuperType)))
container.Register(Component.For<IRepository<T>>()
.ImplementedBy<SuperRepository<T>>());
else
container.Register(Component.For<IRepository<T>>()
.ImplementedBy<Repository<T>>());
}
然后登记:
container.RegisterAccordingToISuperType<SuperType>();
container.RegisterAccordingToISuperType<int>();
而决心将:
var super = container.Resolve<IRepository<SuperType>>();
var intRepo = container.Resolve<IRepository<int>>();
另一个选项是中的额外参数210。然后获取所有类型(Type)(For example),并注册它们。
private static void Register(...)
{
foreach (var type in GetInheriteTypes())
{
container.Register(Component.For(typeof(IRepository<>),type)
.ImplementedBy(typeof(SuperRepository<>)));
}
container.Register(Component.For(typeof(IRepository<>))
.ImplementedBy(typeof(Repository<>)));
}
private static IEnumerable<Type> GetInheriteTypes()
{
var listOfBs = (from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
from assemblyType in domainAssembly.GetTypes()
where assemblyType.GetInterfaces().Contains(typeof(ISuperType))
select assemblyType).ToArray();
return listOfBs;
}
每一层间接(又名有条件)都是由另一层抽象 - FactoryProvider解决的。 –