我试图按照约定注册一个类型,我在这个例子中简化了我的情况:
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());
如果您看到类型没有添加到容器中,请确保您正在扫描正确的程序集(包含实现类型,而不是服务类型的程序集)。