因此,目前我有这样一个存储库实现:
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模块。
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<>));
}
}模式导出和更新像测试一样被调用:
[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上公开事务。
问题本身
我已经听说过SharpArchitecture和UOW。这就够了。
但我对我的数据访问策略解决方案所提供的问题很感兴趣:这样使用它,我将面临哪些错误/故障?
此外,使用Kaleb Pederson NHibernate, transactions and TransactionScope方法提出的解决方案是否也是一种解决方案?
谢谢!
发布于 2012-02-24 15:17:06
你怎么写这样的代码?
// Save both together or none of it
rep1.Save(newSomeEntity);
rep2.Save(SomeOtherEntity);让它不在存储库中是很容易的
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();
}
}https://stackoverflow.com/questions/9430356
复制相似问题