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(“…”)部分来区分使用相同服务的两个组件注册。谢谢@英雄你应该回答你自己的问题并投票表决,这样每个人都知道。