我想知道我的服务层应该了解多少关于存储库的内容?在以前的项目中,我总是返回列表并为所需的每个东西设置一个方法。
例如,如果我需要返回所有ID为5的行,则会有一个方法。我确实拥有用于创建、更新、删除和其他NHibernate选项的通用存储库,但对于查询,我没有。
现在,我开始使用更多的IQueryable,因为我开始遇到为每种情况设置这么多方法的问题。
比如说,如果我需要返回所有具有特定ID且需要3个已加载表格的行,则会有一个新方法。如果我需要某个ID而不需要急切加载,则会有一个单独的方法。
所以现在我在考虑,如果我有一个执行where子句部分并返回IQueryable的方法,那么我就可以添加结果(即如果我需要进行急切加载)。
同时,这使得服务层更加了解存储库层,我不能像现在一样轻松地切换存储库了,因为现在服务层中有特定的NHibernate。
我也不确定这会对模拟造成什么影响。
所以现在我在思考,如果我走这条路,是否还需要存储库,因为它们现在似乎已经混合在一起了。
编辑
如果我摆脱存储库,只在我的服务层中使用会话,那么还需要一个工作单元类吗?
例如,如果我需要返回所有ID为5的行,则会有一个方法。我确实拥有用于创建、更新、删除和其他NHibernate选项的通用存储库,但对于查询,我没有。
现在,我开始使用更多的IQueryable,因为我开始遇到为每种情况设置这么多方法的问题。
比如说,如果我需要返回所有具有特定ID且需要3个已加载表格的行,则会有一个新方法。如果我需要某个ID而不需要急切加载,则会有一个单独的方法。
所以现在我在考虑,如果我有一个执行where子句部分并返回IQueryable的方法,那么我就可以添加结果(即如果我需要进行急切加载)。
同时,这使得服务层更加了解存储库层,我不能像现在一样轻松地切换存储库了,因为现在服务层中有特定的NHibernate。
我也不确定这会对模拟造成什么影响。
所以现在我在思考,如果我走这条路,是否还需要存储库,因为它们现在似乎已经混合在一起了。
编辑
如果我摆脱存储库,只在我的服务层中使用会话,那么还需要一个工作单元类吗?
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();
}
}