代码之家  ›  专栏  ›  技术社区  ›  Matt Mills

Castle Windsor-将泛型实现解析为基类型

  •  2
  • Matt Mills  · 技术社区  · 14 年前

    我尝试使用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> 温莎抛出了一个异常:

    "No component for supporting the service ISpecification'1[ZImplementation, AssemblyInfo...] was found"
    

    2 回复  |  直到 14 年前
        1
  •  0
  •   Patrick Quirk    8 年前

    看到了吗 this 发布。

    更新

    好吧,我现在知道你做错什么了。你没有服务 ISpecification<ZImplementation> 因此,温莎不能解决这个问题也就不足为奇了。

    这根本不是温莎的问题。

        2
  •  0
  •   Alex    10 年前

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

    作为

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

    当温莎找不到具体的实现时,它将使用通用的实现