2011-05-14 38 views
1

我想将我的单元工作传递到我的通用基本存储库,但是当我尝试调用unitofwork未传递到基本存储库的某些方法时。Structuremap构造函数注入工作单元始终为空

这种情况:我将userRepository下面的代码注入到我的UserController中一切正常,当它调用userRepository.Save(user)时,由于unitofwork为null而失败。我不知道为什么?

我使用nhibernate和结构图。我正确地认为香港专业教育学院有线一切了,但这里是一些代码来仔细检查:

这是基础资源库:

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 2011-05-15 13:34:30