[英]Nhibernate Architecture - Generic Nhibernate Repository to serve many different types
我希望獲得一些有關如何改進設計的反饋。 具體來說,我不想為每個域對象創建一個新的存儲庫對象,但是我也不想一遍又一遍地重寫Session和Transaction邏輯。
為了減輕編寫代碼以獲取我創建的每個數據庫事務的新會話和事務的需求,並創建了通用抽象類,如下所示:
public class AbstractNHibernate<T> where T : class
{
public void Add<T>(T entity)
{
using(ISession session = NHibernateHelper.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(entity);
transaction.Commit();
}
}
}
很好,但是隨后我必須為每個域實體創建一個存儲庫,如下所示:
public class ConnectionModel : AbstractNHibernate<Connection>
{
public void SaveConnection(Connection conn)
{
Add(conn);
}
}
我可能會有很多這樣的東西。 有人可以建議其他方法嗎?
提前致謝。
通常,您的存儲庫不應打開會話或執行事務。 這應該在服務層或UI中完成。 使用當前的設計,無法讓多個存儲庫參與同一筆交易。 您可以通過在存儲庫構造函數中要求ISession來實現此目的。
我還不喜歡每個對象模型一個存儲庫,更好的方法是將通用存儲庫功能邏輯地組合在一起。 例如,CompanyRepository將具有用於處理公司和相關數據的方法-CompanyType,CompanyStatus等。
我看到的完成方式(以及執行方式)是建立一個接口,創建一個實現該接口的Nhiberate類(存儲庫模式)
規范模式的使用還允許將查詢傳遞到存儲庫。 更多信息可以在這里找到:
http://www.mostlyclean.com/category/NHibernate.aspx
需要注意的是,會話是在其他地方創建的,然后注入(傳遞)到存儲庫中,我使用諸如Windsor之類的IoC容器來執行此操作。
HTH
也許我不明白您的問題? 您似乎在詢問有關如何實現泛型的更多信息,因此您不必為每個對象創建特定於類型的類,而無需詢問nhibernate問題。
這是一個接受任何類型T的簡單存儲庫。您只需從類簽名中刪除T並實例化即可。 但是請記住,這不過是一個會話包裝程序,一個工作單元而不是一個存儲庫。 實現查詢將需要一些工作以嘗試使其通用。 您可以將類似這樣的東西用作需要復雜查詢的子類型的基類,也可以將其用作獨立實例(如果您僅支持對其他對象的基本查詢)。
/// <summary>
/// Repository defines simple class with standard methods
/// to accept and operate on any type.
/// </summary>
public class Repository
{
private ISession _session;
public ISession Session
{
get { return _session; }
}
/// <summary>
/// Save an entity.
/// </summary>
public void Save<T>(T entity)
{
Reconnect(_session);
try
{
_session.Save(entity);
}
finally
{
Disconnect(_session);
}
}
/// <summary>
/// Update an entity
/// </summary>
public void Update<T>(T entity)
{
Reconnect(_session);
try
{
_session.Update(entity);
}
finally
{
Disconnect(_session);
}
}
/// <summary>
/// Delete an entity
/// </summary>
public void Delete<T>(T entity)
{
Reconnect(_session);
try
{
_session.Delete(entity);
}
finally
{
Disconnect(_session);
}
}
/// <summary>
/// Retrieve an entity
/// </summary>
public T GetById<T>(Guid id)
{
Reconnect(_session);
try
{
return _session.Get<T>(id);
}
finally
{
Disconnect(_session);
}
}
/// <summary>
/// Method for flushing the session.
/// </summary>
public void Flush()
{
Reconnect(_session);
try
{
_session.Flush();
_session.Clear();
}
finally
{
Disconnect(_session);
}
}
/// <summary>
/// Reconnect to the session. Accept parameter so we can use anywhere.
/// </summary>
public void Reconnect(ISession session)
{
if (!session.IsConnected)
{
session.Reconnect();
}
}
/// <summary>
/// Disconnect from the session. Accept parameter so we can use anywhere.
/// </summary>
public void Disconnect(ISession session)
{
if (session.IsConnected)
{
session.Disconnect();
}
}
public Repository(ISession session)
{
_session = session;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.