[英]Using Fluent NHibernate with a Data Access Layer
首先介紹一下背景:我有一個包含以下3個項目的解決方案:
我在DA層中具有Fluent映射,並且(現在)在MVC站點的GLobal.asax中構建Hibernate SessionFactory
。 這不是理想的,因為我想讓NHibernate完全包含在DA層中,並使MVC應用程序僅與API層通信。 另外,我只想構建一次SessionFactory
,因為這是一個昂貴的操作。
為了使事情更復雜,我有一個繼承結構,如下所示:
User object
繼承自 User data object
繼承自 Data object
。 Data object
負責將對象保存到數據庫,因為所有對象的保存功能都相同,因此我不想重復代碼。 我遇到的問題是我怎么保存User object
從內部數據庫中Data object
類,而使用SessionFactory
當用戶登錄到網站,並通過他們的會議堅持,我實例化。
如果有任何不清楚的地方,請告訴我。
一種方法是使用DI模式 ,例如Unity。
實現具有構造函數的data object
,該構造函數采用IRepository接口。 該接口的實現處理nHibernate會話工廠...
您的data object
也可以是通用的,其中T
是一個,例如User data object
。 然后,在data object
實現一個方法,例如使用注入的IRepository
保存,更新,刪除T
data object
偽代碼
public interface IEntity
{
}
public interface IRepository
{
ISession Session { get; }
}
public class DataObjectBase<T> where T : IEntity
{
private IRepository Repository { get; set; }
public DataObjectBase(IRepository repository)
{
this.Repository = repository;
}
public T Get(int id)
{
return Repository.Session.Get<T>(id);
}
public void Save(T value)
{
Repository.Session.Save(value);
}
public void Update(T value)
{
Repository.Session.Update(value);
}
public void Delete(T value)
{
Repository.Session.Delete(value);
}
public IQueryable<T> Query()
{
return Repository.Session.Query<T>();
}
}
特定數據對象的實現
public class ADataObject : IEntity
{
public int Id { get; set; }
// [...]
}
為數據對象實現數據上下文
public class ADataObjectContext : DataObjectBase<ADataObject>
{
public ADataObjectContext(IRepository repository)
: base(repository)
{
}
}
使用Unity的簡單示例測試
public class Test
{
public void Run()
{
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IRepository, NHibernateRepository>();
var ctx = myContainer.Resolve<ADataObjectContext>();
var obj = ctx.Query().Where(p => p.Id == 2);
}
}
當然,您必須實現NHibernateRespository
才能執行您想要的任何操作。
UnityContainer
初始化應在MVC項目的global.asax
完成。 您也可以通過web.config配置Unity。
NHibernateRespository
實際上應該是一個單例。 這可以由您實現,也可以僅使用Unity功能將您的類型實例化為單例。 new ContainerControlledLifetimeManager()
正是這樣做的。
除了可以將會話公開為屬性之外,還可以公開一個打開新會話的方法。 或者您實現工作的開始和結束單元,這是Web環境中的常見做法。
正常存儲庫模式的其他鏈接,以及工作單位,統一性...或直接在Google上搜索nhibernate存儲庫模式
http://slynetblog.blogspot.de/2011/11/in-spite-of-common-now-approach-of.html
http://blog.bobcravens.com/2010/07/using-nhibernate-in-asp-net-mvc/
您可以使用以下選項:
認為會話始終與接口層相關聯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.