【问题标题】:Generic Repository session management asp.net-mvc fluent nhibernate通用存储库会话管理 asp.net-mvc fluent nhibernate
【发布时间】:2011-03-24 19:59:08
【问题描述】:

我的项目遇到了问题。我正在使用带有结构映射的通用存储库和 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);

}

编辑:我已经总结出我需要的东西。我不想将工作单元模式与结构映射一起使用,但我也想拥有某种可以通过工作单元访问的存储库包装器。

谢谢, 詹姆斯·福特

【问题讨论】:

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


    【解决方案1】:

    我认为您正在寻找Unit Of Work pattern,其中事务生命周期由您注入存储库/服务的工作单元控制。

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

    编辑:

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

    1) 将它们映射到结构映射中:

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

    2) 让控制器接受存储库(或封装存储库的服务;这种方法通常是首选)和 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();
    } 
    

    【讨论】:

    • 是的,这就是我要找的。我之前在工作单元模式上达到了顶峰,但我似乎无法理解直到将如何使用我的通用存储库。
    • 是的,您的编辑帮助了我。我现在想出的是我通过 uow 访问我的存储库。所以我只映射 For().Use();并让控制器访问 IUnitOfWork。然后我添加了方法 public Repository RepositoryFor() where TEntity : class,它将会话发送到存储库类,以便我可以通过 uow 访问我的存储库。我不知道这是否不好,但它有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 2012-02-17
    • 2023-04-01
    • 1970-01-01
    • 2011-06-28
    • 2015-06-20
    • 1970-01-01
    相关资源
    最近更新 更多