我想知道我的服務層應該知道我的存儲庫有多少?在過去的項目中,我總是返回列表併爲每個需要的東西提供了一個方法。與NHibernate的庫模式?
因此,如果我需要返回所有具有5將是方法Id的行。我有創建,更新,刪除和其他NHibernate選項的通用資料庫,但查詢我不。
現在我開始爲我拔腿就跑到具有爲每個個案這麼多方法的問題,使用起來更加的IQueryable。
說,如果我需要返回所有具有一定的編號,需要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();
}
}
我會更多地關注它。得到我的是我喜歡服務層不知道關於數據庫的任何事情的想法,這使得單元測試(如果我需要的話)更容易並且易於切換出ORM。你如何處理這些情況? – chobo2 2012-01-02 22:15:32
我也想知道如果我擺脫了倉庫是否有一點指向我的工作單位班呢?請參閱編輯 – chobo2 2012-01-02 23:14:45
您可以使用UnitOfWork來包裝會話,甚至直接使用NH會話。至於單元測試,您可以使用內存數據庫進行單元測試**,使用** NHiberate。這裏有一篇關於Ayende的文章:http://ayende.com/blog/3983/nhibernate-unit-testing – 2012-01-03 06:27:08