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;
    }
}

PersonNHibernateによって作成されているため、コンストラクタインジェクションを使用できません。そしてNHibernateは空のコンストラクターを必要とするので、私はそれをこのようにすることを余儀なくされています。私はそれを処理する別のクラスを紹介できることを知っていますが_personSpecializationManager、それはできません。

クラスから継承する上記のRegistryクラスは、StructureMapで構成されます。行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 に答える