通用存储库会话管理asp.net-mvc流利的nhibernate

时间:2011-03-24 19:59:08

标签: asp.net-mvc-2 fluent-nhibernate structuremap session-management

我的项目遇到了问题。我正在使用带有结构映射的通用存储库以及Fluent NHibernate。一切都运作得很好,但是当谈到交易和会话管理时,我真的不知道该怎么做。我四处寻找答案,但我找不到符合我需要的东西。

我在我的应用程序中做的是我让结构图在获取请求时实例化一个存储库类,如下所示:

internal class RepositoryRegistry : Registry
{
    public RepositoryRegistry()
    {
        For<IRepository<User>>().Use<Repository<User>>();
        For<IRepository<Tasks>>().Use<Repository<Tasks>>();
    }
}

internal class NHibernateRegistry : Registry
{
    public NHibernateRegistry()
    {
        For<ISessionFactory>()
            .Singleton()
            .Use(() => new NHibernateSessionFactory().GetSessionFactory());

        For<ISession>()
            .Singleton()
            .Use(x => x.GetInstance<ISessionFactory>().OpenSession());
    }
}

public interface IRepository<T>
{
    T GetById(int id);

    void SaveOrUpdate(T entity);

    IList<T> GetAll();

    IQueryable<T> Linq();

    void Add(T entity);

}

编辑:我已经完成了我需要的东西。我不想使用工作单元模式和结构图,但我也想要一些可以通过工作单元访问的存储库包装器。

谢谢, 詹姆斯福特

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找Unit Of Work pattern,其中交易生命周期由您注入Repostories / Services的工作单元控制。

有关具有NHibernate和StructureMap的UoW的示例实现,请参阅this answer

修改

如果您已经实现了工作单元和通用存储库,您基本上可以通过以下方式使用它们:

1)在结构图中映射它们:

c.For(typeof(IRepository<>)).Use(typeof(Repository<>));
c.For<IUnitOfWork>().Use<UnitOfWork>();

2)让Controller接受存储库(或封装存储库的服务;这种方法通常是首选)和UnitOfWork:

public class MyController
{
  public MyController(IRepository<MyEntity> repository, IUnitOfWork uow)
  {
     _repository = repository;
     _unitOfWork = uow;
  }
}

这当然也要求您拥有created a custom ControllerFactory

3)在控制器操作中使用工作单元和存储库:

public ViewResult MyAction(MyEntity entity)
{
  _repository.Save(entity);
  _unitOfWork.Commit();
  return View();
}