为什么StructureMap不注入属性?

时间:2013-01-03 08:29:25

标签: asp.net-mvc nhibernate inversion-of-control structuremap

我创建了一个继承自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注入我的属性?

1 个答案:

答案 0 :(得分:3)

  

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

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

  

因为Person是由NHibernate创建的。

因此,StructureMap绝对无法控制此类的实例化。所以你不可能期望在这堂课上发生任何注射。如果你想在你的NHibernate实体中做一些注入,你必须找到一种方法(不记得从我的脑袋)来控制它们的实例化。 IIRC这可以通过订阅NHibernate中的一些事件来实现。因此,在虚构的 OnCreated 事件中,您可以进行注射。但是再一次它将是假注射,因为您现在应该查询StructureMap以检索此Person的实例。这是人们通常称为定位器模式的东西。这被视为Anti-Pattern