Asp.net mvc 2 通用存储库会话管理asp.net-mvc fluent nhibernate
我的项目遇到了问题。我正在使用一个带有结构图的通用存储库以及Fluent NHibernate。一切都很好,但当涉及到事务和会话管理时,我真的不知道该怎么做。我四处寻找答案,但我真的找不到任何适合我需要的 我在应用程序中所做的是,我让structure map在收到存储库类的请求时实例化它,如下所示: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
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();
}