在Castle Windsor中注册一个通用抽象类



我试图按照约定注册一个类型,我在这个例子中简化了我的情况:

public abstract class BaseEntity{}
public class EntityA : BaseEntity{}
public class EntityB : BaseEntity{}
public abstract class BaseClass
{
    //...
}
public abstract class GenericBaseClass<T> : BaseClass where T : BaseEntity
{
    //..
}
public class ConcreteA : GenericBaseClass<EntityA>
{
    //...
}
public class ConcreteB : GenericBaseClass<EntityB>
{
    //...
}

我试图找到注册GenericBaseClass的方法,以便在请求GenericBaseClass<EntityA>时返回ConcreteA。当试图解决这个问题时,我得到一个异常,类似于:

在尝试获取类型的实例时发生激活错误GenericBaseClass ' 1, key "

如果我将GenericBaseClass<T>的定义从抽象类更改为接口,则此注册代码可以工作:

container.Register(AllTypes.FromAssemblyContaining<BaseClass>()
         .BasedOn(typeof(GenericBaseClass<>))
         .WithService.FirstInterface());

但是,我需要使用抽象类,因为我需要在其中编写代码。我可以手动注册每个ConcreteX类,但它不会很有帮助。

我试过了:

container.Register(AllTypes.FromAssemblyContaining<BaseClass>()
         .BasedOn(typeof(GenericBaseClass<>))
         .WithService.Base());

调试,我可以看到类型没有添加到容器。

我用的是温莎城堡2.6。

谢谢。

这行得通:

container.Register(AllTypes.FromAssemblyContaining<ConcreteA>()
                    .BasedOn(typeof (GenericBaseClass<>))
                    .WithService.Base());

如果您看到类型没有添加到容器中,请确保您正在扫描正确的程序集(包含实现类型,而不是服务类型的程序集)。

最新更新