ABP理論學習之NHibernate整合

2021-09-07 04:35:03 字數 2809 閱讀 5479

返回總目錄

倉儲

閱讀其他

abp可以使用任何orm框架工作,並且已經內建了nhibernate整合。這篇文章會解釋如何在abp中使用nhibernate。閱讀本文的前提是假設你已經熟悉了ef的基本知識。

在abp中使用nh作為orm的nuget包是abp.nhibernate。你應該將它新增到應用程式中。最好在應用程式中分離的程式集(dll)中實現nhibernate,並讓該程式集依賴abp.nhibernate包。

要開始使用nhibernate,應該首先要配置它。配置**應該寫在模組的preinitialize方法中。

[dependson(typeof(abpnhibernatemodule))]

public class ******tasksystemdatamodule : abpmodule

public override void initialize()

}

abpnhibernate模組為了使abp能夠使用nhibernate工作提供了基本的功能和介面卡。

在下面的樣例配置中,使用了當前程式集中的所有對映類進行了流暢地對映。乙個對映類的例子如下所示:

public class taskmap : entitymap

}

entitymap是abp繼承了classmap的乙個類,它會自動對映id屬性並在建構函式中獲得表名。因此,我們可以從它派生並使用fluentnhibernate對映其他的屬性。當然,你可以直接從classmap派生,可以使用fluentnhibernate的所有api,也可以使用nhinernate其他的對映技術(比如對映xml檔案)。

你可以使用倉儲的預設實現而不用在專案中建立倉儲類。或者可以建立派生自nhrepositorybase的倉儲類。

倉儲基類

雖然可以從abp的nhrepositorybase中派生倉儲類,但是最佳實踐是建立自己的繼承了nhrepositorybase的基類。這樣,我們就可以輕鬆地將一些公用的方法新增到倉儲中了。例子如下:

//所有倉儲的基類

public abstract class myrepositorybase: nhrepositorybasewhere tentity : class, ientity

//為所有的倉儲新增一些公共的方法

}//id為整數的實體的快捷方式

public abstract class myrepositorybase: myrepositorybasewhere tentity : class, ientity

//不要在這裡新增任何方法,在上面的方法中新增(因為該方法繼承了上面的方法)

}public class taskrepository : myrepositorybase, itaskrepository

//這裡新增一些task倉儲特有的方法

}

預設實現

你不需要為實體類建立倉儲,只需要使用預定義的倉儲方法。例子:

public void createperson(createpersoninput input)

;_personrepository.insert(person);

}} 。自定義倉儲方法

如果你想新增一些自定義的方法,那麼首先應該給它新增倉儲介面(這是最佳實踐),然後在倉儲類中實現。abp提供了乙個基類nhrepositorybase來輕鬆地實現倉儲。要實現倉儲介面,只需要從倉儲基類中派生倉儲就可以了。

假設我們有乙個task(任務)實體,該任務可以派給乙個person(人)實體,而且task實體有這麼幾種狀態,包括new,assigned,completed等等。我們可能需要寫乙個自定義方法來根據一些條件和assignedperson來獲取任務的列表。看下面的**:

public inte***ce itaskrepository : irepository

public class taskrepository : nhrepositorybase, itaskrepository

public listgetallwithpeople(int? assignedpersonid, taskstate? state)

if (state.hasvalue)

return query

.orderbydescending(task => task.creationtime)

.fetch(task => task.assignedperson)

.tolist();

}}

getall()方法返回了iqueryable,然後使用給定的引數新增了一些where過濾。最後使用tolist()獲得tasks的列表。

你也可以在倉儲方法中使用session物件來呼叫nhibernate的全部api。

倉儲應該在它的建構函式中獲得乙個isessionprovider。這樣的話,我們就可以在單元測試中輕鬆地注入乙個偽造的session提供者了。在執行時,abp會自動地注入正確的session提供者。

你也可以檢視倉儲文件獲取更多關於倉儲的知識。

ABP理論學習之Abp Session

返回總目錄 當應用程式要求使用者登入時,那麼應用程式也需要知道當前使用者正在執行的操作。雖然asp.net本身在展現層提供了session物件,但abp也提供了在任何需要獲得當前使用者和租戶的地方都可以使用的iabpsession介面。關於iabpsession 為了獲得實際的session資訊,必...

ABP理論學習之開篇介紹

返回總目錄 為了和2016年春節賽跑,完成該系列部落格,我犧牲了今天中午的時間來完成該系列的第一篇 開篇介紹。開篇介紹嘛,讀過大學教材的同學都知道,這玩意總是那麼無聊,跟考試沒關係,乾脆直接跳過,呵呵,多麼美好的大學時光啊!不過,現在想想,開篇介紹確實不怎麼重要,它只是告訴我們今後我要開始講什麼了,...

ABP理論學習之Nuget包

返回總目錄 abp已經發布在nuget上,這裡是所有包的列表。abp abp系統的核心包。所有其他的包都依賴這個包。abp.web 提供了mvc和web api都使用的一些通用類和資源 abp.web.resource web層的資源 js,css.檔案 abp.web.mvc 提供一些asp.ne...