C# 在Castle Windsor中注册泛型抽象类

C# 在Castle Windsor中注册泛型抽象类,c#,inversion-of-control,castle-windsor,C#,Inversion Of Control,Castle Windsor,我正在尝试按约定注册一个类型,在本例中,我简化了我的案例: public abstract class BaseEntity{} public class EntityA : BaseEntity{} public class EntityB : BaseEntity{} public abstract class BaseClass { //... } public abstract class GenericBaseClass<T> : BaseClass whe

我正在尝试按约定注册一个类型,在本例中,我简化了我的案例:

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>
{
    //...
}
但是,我需要使用抽象类,因为我需要在其中编写代码。 我可以手动注册每个
ConcreteX
类,但这并没有多大帮助

我试过这个:

container.Register(AllTypes.FromAssemblyContaining<BaseClass>()
         .BasedOn(typeof(GenericBaseClass<>))
         .WithService.Base());
container.Register(AllTypes.FromAssemblyContaining()
.BasedOn(typeof(GenericBaseClass))
.with.service.Base());
调试时,我可以看到类型没有添加到容器中

我使用的是温莎城堡2.6

谢谢。

此功能:

container.Register(AllTypes.FromAssemblyContaining<ConcreteA>()
                    .BasedOn(typeof (GenericBaseClass<>))
                    .WithService.Base());
container.Register(AllTypes.FromAssemblyContaining()
.BasedOn(typeof(GenericBaseClass))
.with.service.Base());
如果您看到没有将类型添加到容器中,请确保您正在扫描正确的程序集(包含实现类型而不是服务类型的程序集)。

此操作有效:

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

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

没有Windsor 2.6。你是说2.5.4?没有温莎2.6。你是说2.5.4吗?不能按你的建议去做。这是可行的,但我必须为任何ConcreteX类型添加相同的代码:container.Register(Component.for(typeof(GenericBaseClass)).ImplementedBy(typeof(ConcreteA)).Named(“ConcreteA”);为什么不呢?这正是我的代码所做的(除了名称部分)@Hero,您的解决方案为我工作,我有一个抽象基类和两个实现。我已经有了相同的代码,但是缺少了.Named(“…”)部分来区分使用相同服务的两个组件注册。谢谢@英雄你应该回答你自己的问题并投票表决,这样每个人都知道。不能按照你的建议去做。这是可行的,但我必须为任何ConcreteX类型添加相同的代码:container.Register(Component.for(typeof(GenericBaseClass)).ImplementedBy(typeof(ConcreteA)).Named(“ConcreteA”);为什么不呢?这正是我的代码所做的(除了名称部分)@Hero,您的解决方案为我工作,我有一个抽象基类和两个实现。我已经有了相同的代码,但是缺少了.Named(“…”)部分来区分使用相同服务的两个组件注册。谢谢@英雄你应该回答你自己的问题并投票表决,这样每个人都知道。