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

标签 repository-pattern ravendb n-tier-architecture

我正在一个项目中实现 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/

相关文章:

c# - N 层架构事务处理

jakarta-ee - 2层架构到底是什么?

asp.net - 没有 Entity Framework 的带有 mvc 的存储库模式

oracle - 使用现有存储过程通过 Entity Framework 为 Oracle 数据库生成身份

c# - RavenDB 附件 - 功能怎么做?

c# - 刚刚将 RavenDB 更新为 rev。 2230 从转。 960 和调用 session.SaveChanges() 我有 JsonSerialization 异常

c# - ASP.NET MVC、RavenDb 和单元测试

entity-framework - Entity Framework 6,我应该使用存储库模式吗?

c# - mvvm 存储库过滤

c# - Entity Framework - 分层设计 - 在哪里放置连接字符串?