我正在尝试使用Windsor作为工厂来提供基于XAbstractBase
的子类型的规范实现(在我的例子中是一个抽象的消息基类)。
我的代码如下:
public abstract class XAbstractBase { }
public class YImplementation : XAbstractBase { }
public class ZImplementation : XAbstractBase { }
public interface ISpecification<T> where T : XAbstractBase
{
bool PredicateLogic();
}
public class DefaultSpecificationImplementation : ISpecification<XAbstractBase>
{
public bool PredicateLogic() { return true; }
}
public class SpecificSpecificationImplementation : ISpecification<YImplementation>
{
public bool PredicateLogic() { /*do real work*/ }
}
我的组件注册码如下所示:
container.Register(
AllTypes.FromAssembly(Assembly.GetExecutingAssembly())
.BasedOn(typeof(ISpecification<>))
.WithService.FirstInterface()
)
当我尝试解析ISpecification<YImplementation>
时,此功能正常;它正确地解析了SpecificSpecificationImplementation
。
但是,当我尝试解决ISpecification<ZImplementation>
Windsor引发异常时:
"No component for supporting the service ISpecification'1[ZImplementation, AssemblyInfo...] was found"
如果没有注册更具体的实现,Windsor是否支持将通用实现解析为基类?
答案 0 :(得分:0)
答案 1 :(得分:0)
您可以将其注册为开放式通用,以提供后备,例如
public class DefaultSpecificationImplementation<T> : ISpecification<T>
where T : XAbstractBase
{
public bool PredicateLogic() { return true; }
}
as
Component.For(typeof(ISpecification<>))
.ImplementedBy(DefaultSpecificationImplementation<>)
然后,当Windsor找不到具体的实现时,它将使用通用的