首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >公开存储库上的事务。NHibernate

公开存储库上的事务。NHibernate
EN

Stack Overflow用户
提问于 2012-02-24 11:57:24
回答 1查看 993关注 0票数 1

因此,目前我有这样一个存储库实现:

代码语言:javascript
复制
public class Repository<T> : IRepository<T> where T : AbstractEntity<T>, IAggregateRoot
{
    private ISession session;

    public Repository(ISession session)
    {
        this.session = session;
    }

    public T Get(Guid id)
    {            
        return this.session.Get<T>(id);            
    }
    public IQueryable<T> Get(Expression<Func<T, Boolean>> predicate)
    {
        return this.session.Query<T>().Where(predicate);            
    }
    public IQueryable<T> Get()
    {
        return this.session.Query<T>();            
    }
    public T Load(Guid id)
    {
        return this.session.Load<T>(id);
    }
    public void Add(T entity)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Save(entity);
            transaction.Commit();
        }
    }
    public void Remove(T entity)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Delete(entity);
            transaction.Commit();
        }
    }
    public void Remove(Guid id)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Delete(this.session.Load<T>(id));
            transaction.Commit();
        }
    }
    public void Update(T entity)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Update(entity);
            transaction.Commit();
        }
    }
    public void Update(Guid id)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Update(this.session.Load<T>(id));
            transaction.Commit();
        }
    }
}

然后像这样使用Ninject模块。

代码语言:javascript
复制
public class DataAccessModule : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        this.Bind<ISessionFactory>()
            .ToMethod(c => new Configuration().Configure().BuildSessionFactory())
            .InSingletonScope();

        this.Bind<ISession>()
            .ToMethod(ctx => ctx.Kernel.TryGet<ISessionFactory>().OpenSession())
            .InRequestScope();

        this.Bind(typeof(IRepository<>)).To(typeof(Repository<>));
    }
}

模式导出和更新像测试一样被调用:

代码语言:javascript
复制
[TestFixture]
public class SchemaManipulations
{
    [Test]
    [Ignore]
    public void CreateDatabaseSchema()
    {
        new SchemaExport(new Configuration().Configure()).Create(false, true);
    }

    [Test]
    [Ignore]
    public void UpdateDatabaseSchema()
    {
        new SchemaUpdate(new Configuration().Configure()).Execute(false, true);
    }
}

我保持我的域层“干净”:验证逻辑是用FluentValidation实现的,它既不了解NHibernate也不了解其他任何东西。

这对我来说很完美..。直到我想知道如何实现版本并发。我选择使用optimistic-locking,对于NH来说,正确地映射它并不是一个问题。我需要知道如何处理事务,如何在编辑locked项时通知用户?

因此,还有一个问题出现在version concurrency control for a long session. NHibernate. ASP.NET MVC上,据说不建议在Repository上公开事务。

问题本身

我已经听说过SharpArchitectureUOW。这就够了。

但我对我的数据访问策略解决方案所提供的问题很感兴趣:这样使用它,我将面临哪些错误/故障?

此外,使用Kaleb Pederson NHibernate, transactions and TransactionScope方法提出的解决方案是否也是一种解决方案?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-24 15:17:06

你怎么写这样的代码?

代码语言:javascript
复制
// Save both together or none of it
rep1.Save(newSomeEntity);
rep2.Save(SomeOtherEntity);

让它不在存储库中是很容易的

代码语言:javascript
复制
var rep1 = new Repository<SomeEntity>(session);
var rep2 = new Repository<SomeOtherEntity>(session);
using (var tx = session.BeginTransaction())
{
    try
    {
        rep1.Save(newSomeEntity);
        rep2.Save(SomeOtherEntity);
        tx.Commit();
    }
    catch (SomeException ex)
    {
        Handle(ex);
        tx.RollBack();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9430356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档