2011-05-14 4 views
1

私は、一般的なベース・リポジトリに私のUnitOfWorkに合格しようとしていますが、私は試してみてUnitOfWorkのありえないがベースリポジトリに渡されるメソッドの一部を呼び出すとき。作業のStructureMapコンストラクタインジェクション部常にnull

シナリオ:userControllerにuserRepositoryをすべて注入します。これはuserRepository.Save(user)を呼び出すときにunitofworkがnullになって失敗します。私は確かになぜか分からない?

nhibernateとstructuremapを使用しています。私は、IVEはすべてを正しくセットアップ有線と思いますが、ここでダブルチェックするためにいくつかのコードです:

ここでは、ベースのリポジトリである:

public class BaseRepository<T> : IRepository<T> where T : IAggregateRoot 
{ 
    private readonly IUnitOfWork _unitOfWork; 

    public BaseRepository(IUnitOfWork unitOfWork) 
    { 
    _unitOfWork = unitOfWork; 
    } 

    public BaseRepository() 
    {} 

    public void Save(T Entity) 
    { 
    _unitOfWork.Session.Save(Entity); 
    } 
} 

は、特定のリポジトリ:

public class UserRepository : BaseRepository<User>, IUserRepository 
    { 
    } 

これは私のNHibernateののStructureMap構成です:

public NhibernateRegistry() 
{ 
    For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>(); 

    For(typeof(IRepository<>)).Use(typeof(BaseRepository<>)); 

    // Nhibernate Session 
    For<ISession>().HybridHttpOrThreadLocalScoped().Use(context => context.GetInstance<ISessionFactory>().OpenSession()); 

    // Nhibernate SessionFactory 
    For<ISessionFactory>().Singleton().Use(NhibernateHelper.CreateSessionFactory()); 
}` 

ここは私のnhibernate httpモジュールです:

public class NHibernateModule : IHttpModule 
{ 
    private IUnitOfWork _unitOfWork; 

    public void Init(HttpApplication context) 
    { 
    context.BeginRequest += ContextBeginRequest; 
    context.EndRequest += ContextEndRequest; 
    } 

    private void ContextBeginRequest(object sender, EventArgs e) 
    { 
    _unitOfWork = ObjectFactory.GetInstance<IUnitOfWork>(); 
    } 

    private void ContextEndRequest(object sender, EventArgs e) 
    { 
    try { _unitOfWork.Commit(); } 
    catch { _unitOfWork.Rollback(); } 
    finally { Dispose(); } 
    } 

    public void Dispose() 
    { 
    if (_unitOfWork != null) 
     _unitOfWork.Dispose(); 
    } 

}

答えて

4

UserRepositoryはIUnitOfWorkを取り込み、BaseRepositoryコンストラクタに渡すコンストラクタを必要とします。現在、UserRepositoryはBaseRepositoryのパラメータのないコンストラクタを使用しているため、IUnitOfWorkは注入されません。パラメータのないコンストラクタを取り除き、すべての派生型がIUnitOfWorkをベースに渡すことを確認します。

+0

私はそれを逃したと信じていました!はい、私はベースを使用する必要があります:ベースリポジトリから(ユニットワーク)! – gdp

関連する問題