【发布时间】:2011-10-10 14:16:44
【问题描述】:
我正在一个项目中实现 RavenDB,在尝试了几天后,我正在构建这个应用程序,但我有一个问题。
我正在为每个实体(几乎)编写业务层,并且我有一个独特的存储库类来处理查询和 DocumentStore。 我对如何沿着服务层共享 DocumentStore 并处理事务感到困惑。
我正在展示一个示例,我尝试在单个事务中存储和读取文档。
存储库示例:
public class RavenRepository
{
private static DocumentStore _store;
private IDocumentSession _session;
public RavenRepository(DocumentStore store)
{
_store = (_store==null) ? new DocumentStore() { Url = "http://wsk-gcardoso:8081" } : store;
}
public T SingleOrDefault<T>(Func<T, bool> predicate) where T : BaseModel
{
using (var session = _store.OpenSession())
{
return session.Query<T>().SingleOrDefault(predicate);
}
}
public T Add<T>(T item) where T : BaseModel
{
using (var session = _store.OpenSession())
{
session.Advanced.AllowNonAuthoritiveInformation = this.AllowNonAuthoritiveInformation;
session.Store(item);
session.SaveChanges();
}
return item;
}
public void Initialize() {
_store.Initialize();
}
public void Dispose() {
_store.Dispose();
}
}
一个业务层应该是这样的:
public class NewsletterBusiness
{
private RavenRepository repository;
public NewsletterBusiness(RavenRepository ravenRepository)
{
repository = (ravenRepository == null) ? RavenRepository(null) : ravenRepository;
}
public Newsletter Add(Newsletter newsletter)
{
Newsletter news = repository.Add(newsletter);
return news;
}
public Newsletter GetById(long Id)
{
Newsletter news = repository.SingleOrDefault<Newsletter>(x => x.Id == Id);
return news;
}
}
现在我正在尝试在同一个事务中保存和读取一个对象(通讯)。 根据我的阅读,我必须将 documentStore 的 AllowNonAuthoritativeInformation 设置为 false 才能等到事务完成。但是从我处理层和存储库的方式来看,我是否在单个事务中存储和查询数据库?
说实话,我认为我对存储的 OpenSession 方法感到困惑。我想我将会话与事务混淆了。
例如这段代码:
var repository = new RavenRepository(null);
newsletterBusiness = new NewsletterBusiness(repository);
repository.Initialize();
using (var tx = new TransactionScope())
{
Newsletter new = newsletterBusiness.Add(new Newsletter { Title = "Created by Tests", Content = "Created By Tests" });
Newsletter objectCreated = newsletterBusiness.GetById(new.Id);
repository.Dispose();
tx.Complete();
}
如果我创建第二个业务层(例如图片)并设置 picturesBusiness.repository = repository(为 businessLayer 设置相同的“RavenRepository 对象),我将在相同的环境中工作newsletterBusiness.repository 的会话?
picturesBusiness = new PicturesBusiness(repository);
Picture pic = picturesBusiness.GetById(20);
我非常感谢有关此主题的帮助, 来自葡萄牙的干杯!
【问题讨论】:
标签: repository-pattern ravendb n-tier-architecture