1

我創建了一個繼承自Registry類的類。在這一類我想注入屬性:爲什麼StructureMap不注入屬性?

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注入我的財產?

回答

3

我不能使用構造函數注入,因爲Person是由NHibernate創建的。

我要強調在你的句子中包含的回答你的問題極爲重要的一部分:

,因爲人是由NHibernate的創建。

所以StructureMap完全不能控制這個類的實例化。所以你不可能期望在這個課堂上發生任何注射。如果你想在你的NHibernate實體中進行一些注入,你將不得不從頭腦中找出一種方式來控制它們的實例化。通過訂閱NHibernate中的一些事件,IIRC是可能的。所以在虛構的OnCreated事件中你可以做注射。但再一次,它將是假注入,因爲您現在應該查詢StructureMap來檢索此Person的實例。這就是人們通常稱之爲定位符模式。並認爲這是一個Anti-Pattern

+0

有道理,沒想到創作故事。 – Martijn

相關問題