簡體   English   中英

將Fluent NHibernate與數據訪問層配合使用

[英]Using Fluent NHibernate with a Data Access Layer

首先介紹一下背景:我有一個包含以下3個項目的解決方案:

  • MVC項目(面向用戶的網站)
  • API項目(業務邏輯項目)
  • 數據訪問項目(NHibernate所在的項目)

我在DA層中具有Fluent映射,並且(現在)在MVC站點的GLobal.asax中構建Hibernate SessionFactory 這不是理想的,因為我想讓NHibernate完全包含在DA層中,並使MVC應用程序僅與API層通信。 另外,我只想構建一次SessionFactory ,因為這是一個昂貴的操作。

為了使事情更復雜,我有一個繼承結構,如下所示:

  • API層中的User object繼承自
  • DA層中的User data object繼承自
  • DA層中的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/

http://msdn.microsoft.com/en-us/library/dd203101.aspx

您可以使用以下選項:

  • 使用AOP:在API層中調用函數時,AOP創建一個會話並將方法或構造函數中的value參數傳遞給DA層。
  • 從MVC項目到DA層,它會通過方法o構造函數中的所有層將會話傳遞給DA層。

認為會話始終與接口層相關聯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM