0

我是第一次使用 DDD,所以我是初学者!所以,让我们认为它非常简单:D 我使用 asp.net mvc 2、ddd 和 nhibernate 开发了一个应用程序。我在一个类库中有一个域模型,在另一个类库中有一个存储库,还有一个 asp.net mvc 2 应用程序。我的 Repository 基类,我有一个注入和依赖的构造(我的唯一 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();
   }
}

我听说过 NHibernateUnitOfWork,但我不知道 :(,如何配置 NHibernateUnitOfWork 以使用我的存储库?我应该更改我的简单存储库吗?欢迎提出建议!

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

PS:对不起我的英语!

再见 =D

4

3 回答 3

2

会话是 NHibernate 的工作单元。但是您始终可以创建自己的抽象。

using (var tx = Session.BeginTransaction) { ...
于 2010-05-20T19:52:06.883 回答
1

您可以将存储库上的会话设为公共属性。然后您可以执行以下操作:

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

在一些相关的说明中,这应该都在服务层内部,而不是在您的控制器中。然后控制器应该引用您的服务。

于 2010-05-20T19:56:21.083 回答
1

有一个名为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 的完整推荐方法。

于 2010-05-20T20:00:35.010 回答