gpt4 book ai didi

repository-pattern - 应用程序架构 - 使用 RavenDB 的事务

转载 作者:行者123 更新时间:2023-12-04 22:00:16 26 4
gpt4 key购买 nike

我正在一个项目中实现 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 设置为 false 以等待事务完成。但是从我处理层和存储库的方式来看,我是否在单个事务中存储和查询数据库?

老实说,我觉得我对 感到困惑OpenSession 存储方法。我想我将 session 与交易混淆了。

例如,这段代码:
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();
}

如果我创建第二个业务层(例如图片)并设置 图片业务.repository = 存储库 (为 businessLayer 设置的相同“RavenRepository 对象)我将在 newsletterBusiness.repository 的同一 session 中工作?
picturesBusiness = new PicturesBusiness(repository);
Picture pic = picturesBusiness.GetById(20);

我真的很感激在这个问题上的帮助,
来自葡萄牙的欢呼!

最佳答案

您没有正确使用 RavenDB,这就是您遇到此问题的原因。
您可以将 session 视为数据库连接。在您的模型中,您正在为每种类型创建一个单独的 session 。但真的没有真正的理由为什么你要这样做。

事实上,您不想这样做,因为 session 完全能够同时处理多种类型。
此外,您所做的实际上是减少 session 机会来优化诸如将一批更新发送到服务器之类的事情。

如果您想要跨类型的事务写入,鉴于您的体系结构,您将不得不使用 DTC,因为每个不同的 session 都是与数据库的不同连接。如果您使用 Session per Request 模型,您将只有一个 session ,并且只需调用一次 SaveChanges() 即可获得事务语义。

关于repository-pattern - 应用程序架构 - 使用 RavenDB 的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7714104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com