1

の2つのインターフェイスに1つのタイプを登録することはできますか?StructureMap?見て:Structure Mapの2つのインターフェイスの1つのタイプを登録します

public interface IUnitOfWork { } 

public interface IUnitOfWork<TSession> : IUnitOfWork { } 

public class NHibernateUnitOfWork : IUnitOfWork<ISession> { } 

私はIUnitOfWorkIUnitOfWork<TSession>例えば両方のためNHibernateUnitOfWorkを登録します1つのインスタンスNHibernateUnitOfWork - http要求 - IUnitOfWorkIUnitOfWork<TSession>の両方を担当する必要があります。私はこのレジストリを使用します:

For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<NHibernateUnitOfWork>(); 
For<IUnitOfWork<>>().HybridHttpOrThreadLocalScoped().Use<NHibernateUnitOfWork>(); 

しかし、私はこのcurrectかどうか分かりませんか?私を助けてくれますか?

答えて

2

は、フォワードコマンドを参照してください:

https://stackoverflow.com/a/2366838/156533

あなたがシングルトンをしたくない場合は、ちょうど、ライフサイクルを変更する必要があります。

0

登録を見ると、コンテナが両方の登録用に単一のHTTPコンテキスト内に単一のNHibernateUnitOfWorkを作成することが期待されます。言い換えれば、私は次のテストが失敗することを期待:

var uow1 = container.GetInstance<IUnitOfWork>(); 
var uow2 = container.GetInstance<IUnitOfWork<ISession>>(); 
Assert.IsTrue(object.ReferenceEquals(uow1, uow2)); 

前回のテストパスを作ることになる、IUnitOfWorkIUnitOfWork<ISession>の両方を解決するときに、あなたはおそらく後に同じインスタンスをreturingコンテナを持っているされている何。

あなたは以下にご登録を変更することができます。この場合

For<NHibernateUnitOfWork>().HybridHttpOrThreadLocalScoped(); 
For<IUnitOfWork>().LifecycleIs(new UniquePerRequestLifeStyle()) 
    .Use(() => container.GetInstance<NHibernateUnitOfWork>()); 
For<IUnitOfWork<ISession>>().LifecycleIs(new UniquePerRequestLifeStyle()) 
    .Use(() => container.GetInstance<NHibernateUnitOfWork>()); 

を、あなたはIUnitOfWorkを要求するたびに、あなたは、コンテナにコールバックするとHybridHttpOrThreadLocalScopedとして構成されNHibernateUnitOfWorkを要求されます。この回答で示されているよう

関連する問題