Asp.net mvc 2 通用存储库会话管理asp.net-mvc fluent nhibernate

Asp.net mvc 2 通用存储库会话管理asp.net-mvc fluent nhibernate,asp.net-mvc-2,fluent-nhibernate,structuremap,session-management,Asp.net Mvc 2,Fluent Nhibernate,Structuremap,Session Management,我的项目遇到了问题。我正在使用一个带有结构图的通用存储库以及Fluent NHibernate。一切都很好,但当涉及到事务和会话管理时,我真的不知道该怎么做。我四处寻找答案,但我真的找不到任何适合我需要的 我在应用程序中所做的是,我让structure map在收到存储库类的请求时实例化它,如下所示: internal class RepositoryRegistry : Registry { public RepositoryRegistry() { For&l

我的项目遇到了问题。我正在使用一个带有结构图的通用存储库以及Fluent NHibernate。一切都很好,但当涉及到事务和会话管理时,我真的不知道该怎么做。我四处寻找答案,但我真的找不到任何适合我需要的

我在应用程序中所做的是,我让structure map在收到存储库类的请求时实例化它,如下所示:

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);

}
内部类RepositoryRegistry:Registry
{
公共回购登记处()
{
For().Use();
For().Use();
}
}
内部类NHibernateRegistry:注册表
{
公共NHibernateRegistry()
{
For()
.Singleton()
.Use(()=>newNHibernateSessionFactory().GetSessionFactory());
For()
.Singleton()
.Use(x=>x.GetInstance().OpenSession());
}
}
公共接口假定
{
T GetById(int-id);
作废保存或更新(T实体);
IList GetAll();
IQueryable Linq();
无效添加(T实体);
}
编辑:我已经得出我需要的结论。我不想将工作单元模式与结构图一起使用,但我还想拥有某种可以通过工作单元访问的存储库包装器

谢谢,
James Ford

我认为您正在寻找的是,事务生命周期由注入到Repostories/服务中的工作单元控制

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

编辑:

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

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

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

是的,这就是我要找的。我以前在工作单元模式上达到过顶峰,但我似乎不明白till将如何使用我的通用存储库。是的,你的编辑帮助了我。我现在想到的是通过uow访问我的存储库。所以我只映射像For();并让控制器访问IUnitOfWork。然后我添加了方法public Repository RepositoryFor(),其中tenty:class将会话发送到Repository类,这样我就可以通过uow访问我的存储库。我不知道这是不是坏的,但它的工作。
public class MyController
{
  public MyController(IRepository<MyEntity> repository, IUnitOfWork uow)
  {
     _repository = repository;
     _unitOfWork = uow;
  }
}
public ViewResult MyAction(MyEntity entity)
{
  _repository.Save(entity);
  _unitOfWork.Commit();
  return View();
}