代码之家  ›  专栏  ›  技术社区  ›  Felipe Oriani

nhibernateunofwork+ASP.Net MVC

  •  0
  • Felipe Oriani  · 技术社区  · 16 年前

    我是第一次和DDD在一起,所以我很乞求!所以,让我们假设它非常简单:D 我使用asp.NETMVC2、ddd和nhibernate开发了一个应用程序。我在类库中有一个域模型,在另一个类库中有我的存储库,还有一个asp.NETMVC2应用程序。在我的存储库基类中,我有一个注入的构造和依赖关系(我唯一的ISessionFactory对象从global.asax开始),代码是:

    public class Repository<T> : IRepository<T>
        where T : Entidade
    {
        protected ISessionFactory SessionFactory { get; private set; }
        protected ISession Session
        {
            get { return SessionFactory.GetCurrentSession(); }
        }
    
        protected Repository(ISessionFactory sessionFactory)
        {
            SessionFactory = sessionFactory;
        }        
    
        public void Save(T entity)
        {
            Session.SaveOrUpdate(entity);
        }
    
        public void Delete(T entity)
        {
            Session.Delete(entity);
        }
    
        public T Get(long key)
        {
            return Session.Get<T>(key);
        }
    
        public IList<T> FindAll()
        {
            return Session.CreateCriteria(typeof(T)).SetCacheable(true).List<T>();
        }
    }
    

    在我有了特定的存储库之后,像这样:

    public class DocumentRepository : Repository<Domain.Document>, IDocumentRepository
    {
            // constructor
            public DocumentRepository (ISessionFactory sessionFactory) : base(sessionFactory) 
            { }
    
            public IList<Domain.Document> GetByType(int idType)
            {
                var result = Session.CreateQuery("from Document d where d.Type.Id = :IdType")
                    .SetParameter("IdType", idType)
                    .List<Domain.Document>();
    
                return result;
            }
    }
    

    在这段代码中没有事务控制,它工作得很好,但是,我想在我的asp.net mvc控制器中做一些东西来控制这个存储库,一些简单的东西,比如:

    using (var tx = /* what can I put here ? */) {
       try 
       {
         _repositoryA.Save(objA);
         _repositoryB.Save(objB);
         _repositotyC.Delete(objC);
         /* ... others tasks ... */
    
         tx.Commit();
       }
       catch
       {
         tx.RollBack();
       }
    }
    

    我听说过关于nhibernateunofwork的事,但我不知道:(, 如何配置nhibernateunofwork以使用我的存储库?我应该更改我的简单存储库吗?

    所以,如果有人读到这里,谢谢!如果你能帮我,我很感激!

    PS:对不起我的英语!

    再见=D

    3 回复  |  直到 16 年前
        1
  •  1
  •   Randy Burden    13 年前

    有一个很棒的图书馆叫做 NCommon source )这提供了一个很好的内置UnitOfWork实现。版本1.1允许您执行以下操作:

    public class Foo
    {
        private readonly IRepository<Stuff> _repository;
    
        public Foo(IRepository<Stuff> repository)
        {
             _repository = repository;
        }
    
        public void DoSomething()
        {
            using (var scope = new UnitOfWorkScope())
            {
               _repository.Save(a);
               scope.Commit();
            }
        }
    }
    

    它与最新的NHibernate集成,甚至使用NHibernate.Linq提供一些强大的查询功能。你几乎没有或根本没有什么可以建立自己,这是伟大的开箱即用。

    我详细阐述了我的示例,以展示在具有依赖注入的项目中使用NCommon的完整推荐方法。

        2
  •  2
  •   epitka    16 年前

    会话是NHibernate的工作单元。但你总是可以创建自己的抽象概念。

    using (var tx = Session.BeginTransaction) { ...
    
        3
  •  1
  •   Keith Rousseau    16 年前

    using(var tx = _repository.Session.BeginTransaction())
    

    有点相关的一点,这应该都在服务层内部,而不是在您的控制器中。那么控制器应该有对您的服务的引用。