Castle Windsor - 将基本类型的通用实现解析

时间:2010-06-14 17:14:02

标签: c# generics castle-windsor

我正在尝试使用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是否支持将通用实现解析为基类?

2 个答案:

答案 0 :(得分:0)

请参阅this帖子。

更新

好的,我现在看到你做错了什么。你没有ISpecification<ZImplementation>的服务,因此温莎无法解决它并不奇怪。

这根本不是温莎的问题。

答案 1 :(得分:0)

您可以将其注册为开放式通用,以提供后备,例如

public class DefaultSpecificationImplementation<T> : ISpecification<T>
    where T : XAbstractBase
{
    public bool PredicateLogic() { return true; }
}

as

Component.For(typeof(ISpecification<>))
    .ImplementedBy(DefaultSpecificationImplementation<>)

然后,当Windsor找不到具体的实现时,它将使用通用的