gpt4 book ai didi

nhibernate - 使用 NHibernate 的存储库模式?

转载 作者:行者123 更新时间:2023-12-03 17:57:07 26 4
gpt4 key购买 nike

我想知道我的服务层应该对我的存储库了解多少?在过去的项目中,我总是返回列表并为我需要的每件事都有一个方法。

因此,如果我需要返回 ID 为 5 的所有行,那将是一种方法。我确实有用于创建、更新、删除和其他 NHibernate 选项的通用存储库,但用于查询我没有。

现在我开始使用更多的 IQueryable,因为我开始遇到每种情况都有这么多方法的问题。

假设我需要返回所有具有特定 Id 并需要 3 个表的表,其中急切加载这将是一种新方法。如果我需要某个 Id 并且不需要急切加载,那将是一个单独的方法。

所以现在我在想,如果我的方法执行 where 子句部分并返回 IQueryable 那么我可以添加结果(即,如果我需要进行预先加载)。

与此同时,虽然这现在使服务层更加了解存储库层,但我不再可以像现在我在服务层中拥有特定的 NHibernate 那样轻松地切换存储库。

我也不确定这会如何影响 mock 。

所以现在我想知道是否需要存储库,因为现在它们似乎已经混合在一起了。

编辑

如果我摆脱了我的存储库并且只在我的服务层中有 session ,那么有一个工作单元单元吗?

public class UnitOfWork : IUnitOfWork, IDisposable
{
private ITransaction transaction;
private readonly ISession session;

public UnitOfWork(ISession session)
{
this.session = session;
session.FlushMode = FlushMode.Auto;
}

/// <summary>
/// Starts a transaction with the database. Uses IsolationLevel.ReadCommitted
/// </summary>
public void BeginTransaction()
{
transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);
}

/// <summary>
/// starts a transaction with the database.
/// </summary>
/// <param name="level">IsolationLevel the transaction should run in.</param>
public void BeginTransaction(IsolationLevel level)
{
transaction = session.BeginTransaction(level);
}

private bool IsTransactionActive()
{
return transaction.IsActive;
}

/// <summary>
/// Commits the transaction and writes to the database.
/// </summary>
public void Commit()
{
// make sure a transaction was started before we try to commit.
if (!IsTransactionActive())
{
throw new InvalidOperationException("Oops! We don't have an active transaction. Did a rollback occur before this commit was triggered: "
+ transaction.WasRolledBack + " did a commit happen before this commit: " + transaction.WasCommitted);
}

transaction.Commit();
}

/// <summary>
/// Rollback any writes to the databases.
/// </summary>
public void Rollback()
{
if (IsTransactionActive())
{
transaction.Rollback();
}
}

public void Dispose() // don't know where to call this to see if it will solve my problem
{
if (session.IsOpen)
{
session.Close();
}

}

最佳答案

每个人都有自己的意见如何使用存储库,抽象什么等等。Ayende Rahien 有几个关于这个问题的好帖子:Architecting in the pit of doom: The evils of the repository abstraction layerRepository is the new Singleton .这些给了你一些很好的理由为什么你不应该尝试在 NHibernate 的 ISession 之上创建另一个抽象。

关于nhibernate - 使用 NHibernate 的存储库模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8696090/

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