我创建了一个继承自Registry
类的类。在这个课程中,我想注入一个属性:
ForConcreteType<Person>()
.Configure
.Setter(s => s.PersonSpecializationManager)
.Is(t => t.GetInstance<IPersonSpecializationManager>());
属性定义如下:
/// <summary>
/// Gets or sets the person specialization manager
/// </summary>
public virtual IPersonSpecializationManager PersonSpecializationManager
{
get
{
return _personSpecializationManager;
}
set
{
_personSpecializationManager = value;
}
}
我无法使用构造函数注入,因为Person
是由NHibernate创建的。由于NHibernate需要一个空的构造函数,我不得不这样做。我知道我可以引入另一个处理_personSpecializationManager
内容的类,但我不能这样做。
继承自Registry
类的上述类在StructureMap中配置。当我在第ForConcreteType<Person>() ...
行放置断点时,会触发断点。所以我知道它应该由StructureMap处理。
所以,我的问题是,为什么没有StructureMap注入我的属性?
答案 0 :(得分:3)
我不能使用构造函数注入,因为Person是由NHibernate创建的。
让我强调你的句子中一个非常重要的部分,其中包含你问题的答案:
因为Person是由NHibernate创建的。
因此,StructureMap绝对无法控制此类的实例化。所以你不可能期望在这堂课上发生任何注射。如果你想在你的NHibernate实体中做一些注入,你必须找到一种方法(不记得从我的脑袋)来控制它们的实例化。 IIRC这可以通过订阅NHibernate中的一些事件来实现。因此,在虚构的 OnCreated 事件中,您可以进行注射。但是再一次它将是假注射,因为您现在应该查询StructureMap以检索此Person的实例。这是人们通常称为定位器模式的东西。这被视为Anti-Pattern
。