1

我创建了一个从该类继承的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 中配置的。当我在 line 放置断点时ForConcreteType<Person>() ...,断点被命中。所以我知道它应该由 StructureMap 处理。

所以,我的问题是,为什么 StructureMap 注入不是我的财产?

4

1 回答 1

3

我不能使用构造函数注入,因为 Person 是由 NHibernate 创建的。

让我强调一下你句子中一个极其重要的部分,其中包含你问题的答案:

因为 Person 是由 NHibernate 创建的。

因此 StructureMap 完全无法控制此类的实例化。所以你不可能期望在这个类中发生任何注入。如果你想在你的 NHibernate 实体中进行一些注入,你将不得不找到一种方法(我的脑袋不记得了)来控制它们的实例化。IIRC 这可以通过订阅 NHibernate 中的一些事件来实现。因此,在虚构的OnCreated事件中,您可以进行注入。但是这又一次是假注入,因为您现在应该查询 StructureMap 以检索此 Person 的实例。这就是人们通常所说的定位器模式。这被认为是一个Anti-Pattern.

于 2013-01-03T08:32:54.713 回答