溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ASP.NET ABP應(yīng)用服務(wù)有什么用

發(fā)布時間:2021-12-06 14:23:28 來源:億速云 閱讀:134 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“ASP.NET ABP應(yīng)用服務(wù)有什么用”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

應(yīng)用服務(wù)用于將領(lǐng)域(業(yè)務(wù))邏輯暴露給展現(xiàn)層。展現(xiàn)層通過傳入DTO(數(shù)據(jù)傳輸對象)參數(shù)來調(diào)用應(yīng)用服務(wù),而應(yīng)用服務(wù)通過領(lǐng)域?qū)ο髞韴?zhí)行相應(yīng)的業(yè)務(wù)邏輯并且將DTO返回給展現(xiàn)層。因此,展現(xiàn)層和領(lǐng)域?qū)訉⒈煌耆綦x開來。在一個理想的層級項目中,展現(xiàn)層應(yīng)該從不直接訪問領(lǐng)域?qū)ο蟆?br/>

IApplicationService接口

在ABP中,一個應(yīng)用服務(wù)需要實現(xiàn)IApplicationService接口。最好的實踐是針對每個應(yīng)用服務(wù)都創(chuàng)建相應(yīng)的接口。所以,我們首先定義一個應(yīng)用服務(wù)接口,如下所示:

public interface IPersonAppService : IApplicationService
{    void CreatePerson(CreatePersonInput input);
}

IPersonAppService只有一個方法,它將被展現(xiàn)層調(diào)用來創(chuàng)建一個新的Person。CreatePersonInput是一個DTO對象,如下所示:

public class CreatePersonInput : IInputDto
{
[Required]
public string Name { get; set; }

public string EmailAddress { get; set; }
}

接著,我們實現(xiàn)IPersonAppService接口:

public class PersonAppService : IPersonAppService
{
private readonly IRepository<Person> _personRepository;

public PersonAppService(IRepository<Person> personRepository)
{
_personRepository = personRepository;
}

public void CreatePerson(CreatePersonInput input)
{
var person = _personRepository.FirstOrDefault(p => p.EmailAddress == input.EmailAddress);
if (person != null)
{
throw new UserFriendlyException("There is already a person with given email address");
}

person = new Person { Name = input.Name, EmailAddress = input.EmailAddress };
_personRepository.Insert(person);
}
}

以下是幾個重要提示:

  • PersonAppService通過IRepository來執(zhí)行數(shù)據(jù)庫操作。它通過構(gòu)造器注入模式來生成。我們在這里使用了依賴注入。

  • PersonAppService實現(xiàn)了IApplicationService(通過IPersonAppService繼承IApplicationService)。ABP會自動地把它注冊到依賴注入系統(tǒng)中,并可以注入到別的類型中使用。

  • CreatePerson方法需要一個CreatePersonInput類型的參數(shù)。這是一個作為輸入的DTO,它將被ABP自動驗證其數(shù)據(jù)有效性??梢圆榭碊TO和數(shù)據(jù)有效性驗證(Validation)文檔獲取相關(guān)細節(jié)。

應(yīng)用服務(wù)類型

應(yīng)用服務(wù)(Application Services)需要實現(xiàn)IApplicationService接口。當然,你可以選擇將你的應(yīng)用服務(wù)(Application Services)繼承自ApplicationService基類,這樣你的應(yīng)用服務(wù)也就自然而然的實現(xiàn)IApplicationService接口了。ApplicationService基類提供了方便的日志記錄和本地化功能。在此建議你針對你的應(yīng)用程序創(chuàng)建一個應(yīng)用服務(wù)基類繼承自ApplicationService類型。這樣你就可以添加一些公共的功能來提供給你的所有應(yīng)用服務(wù)使用。一個應(yīng)用服務(wù)示例如下所示:

public class TaskAppService : ApplicationService, ITaskAppService
{
public TaskAppService()
{
LocalizationSourceName = "SimpleTaskSystem";
}

public void CreateTask(CreateTaskInput input)
{
//記錄日志,Logger定義在ApplicationService中
Logger.Info("Creating a new task with description: " + input.Description);

//獲取本地化文本(L是LocalizationHelper.GetString(...)的簡便版本, 定義在 ApplicationService類型)
var text = L("SampleLocalizableTextKey");

//TODO: Add new task to database...
}
}

本例中我們在構(gòu)造函數(shù)中定義了LocalizationSourceName,但你可以在基類中定義它,這樣你就不需要在每個具體的應(yīng)用服務(wù)中定義它。查看日志記錄(logging)和本地化(localization)文檔可以獲取更多的相關(guān)信息。

工作單元

在ABP中,一個應(yīng)用服務(wù)方法默認是一個工作單元。

(1)連接 & 事務(wù)管理 (For connection & transaction management)

在應(yīng)用服務(wù)方法中,如果我們需要調(diào)用兩個倉儲方法,那么這些方法必須為一個事務(wù)。舉個例子:

public void CreatePerson(CreatePersonInput input)
{    var person = new Person { Name = input.Name, EmailAddress = input.EmailAddress };    
    _personRepository.Insert(person);
    _statisticsRepository.IncrementPeopleCount();
}

我們向Person表插入一個數(shù)據(jù),接著在其他表中修改了Person計數(shù)字段的值。這兩個操作實現(xiàn)于不同的倉儲中,但是它們使用了相同的數(shù)據(jù)連接和事務(wù)。這是怎么實現(xiàn)的呢?

對于UOW模式,當事務(wù)啟動并且開始執(zhí)行CreatePerson方法的時候,ABP會自動地打開數(shù)據(jù)庫。在方法結(jié)束時,如果未發(fā)生異常該事務(wù)將會被提交,并確保關(guān)閉數(shù)據(jù)庫連接。因此,CreatePerson方法中的所有數(shù)據(jù)庫操作將作為一個事務(wù)(具有原子性),當有異常拋出時這些事務(wù)中的操作將會回滾。所以,示例中的兩個倉儲方法使用了相同的數(shù)據(jù)連接和事務(wù)。

當你調(diào)用倉儲中的GetAll()方法時,它將返回一個IQueryable。數(shù)據(jù)庫連接應(yīng)會在調(diào)用倉儲方法后打開。這是因為IQueryable和LINQ的延遲執(zhí)行。當你調(diào)用類似ToList()方法時,數(shù)據(jù)庫查詢才會真正的開始執(zhí)行。來看下面的示例:

public SearchPeopleOutput SearchPeople(SearchPeopleInput input)
{
//獲取 IQueryable<Person>
var query = _personRepository.GetAll();

//過濾數(shù)據(jù)
if (!string.IsNullOrEmpty(input.SearchedName))
{
query = query.Where(person => person.Name.StartsWith(input.SearchedName));
}

if (input.IsActive.HasValue)
{
query = query.Where(person => person.IsActive == input.IsActive.Value);
}

//獲取分頁
var people = query.Skip(input.SkipCount).Take(input.MaxResultCount).ToList();

return new SearchPeopleOutput {People = Mapper.Map<List<PersonDto>>(people)};
}

由于一個應(yīng)用服務(wù)(Application Services)方法就是一個工作單元,所以數(shù)據(jù)庫連接在方法執(zhí)行期間都是開啟的。如果你在非應(yīng)用服務(wù)(Application Services)中調(diào)用GetAll(),你需要顯式的使用工作單元模式。如:在Controller的Action方法中要使用GetAll()或調(diào)用多個有對數(shù)據(jù)庫操作的AppService方法時, 應(yīng)該將Action方法使用virtual修飾,并在Action的上面通過[UnitOfWork]進行顯示開啟工作單元模式。

注意我使用了AutoMapper庫將List轉(zhuǎn)換成List??梢圆榭碊TO文檔獲取相關(guān)細節(jié)。

譯者-天道注:這里要說一下,就是uow和非uow模式的區(qū)別,兩種模式對于數(shù)據(jù)庫連接的打開和關(guān)閉是不同的。對于控制器的方法,ABP默認是非 uow模式,此時如果調(diào)用方法會報錯,提示數(shù)據(jù)庫未連接。解決的辦法是在方法加上virtual。

(2)自動保存數(shù)據(jù)修改 (For automatically saving changes)

對于工作單元方法(應(yīng)用服務(wù)(Application Services)方法),在方法結(jié)束時ABP將會自動保存所有數(shù)據(jù)修改。假設(shè)我們需要一個應(yīng)用服務(wù)(Application Services)方法來更新一個Person的Name:

public void UpdateName(UpdateNameInput input)
{    var person = _personRepository.Get(input.PersonId);
    person.Name = input.NewName;
}

就是這樣,Name被成功修改!我們甚至不需要調(diào)用_personRepository.Update方法。ORM框架在工作單元中會跟蹤所有實體修改并將修改更新到數(shù)據(jù)庫中。

應(yīng)用服務(wù)的生命周期

所有應(yīng)用服務(wù)(Application Services)實例的生命周期都是暫時的(Transient)。這意味著在每次使用都會創(chuàng)建新的應(yīng)用服務(wù)(Application Services)實例。ABP堅決地使用依賴注入技術(shù)。當一個應(yīng)用服務(wù)(Application Services)類型需要被注入時,該應(yīng)用服務(wù)(Application Services)類型的新實例將會被依賴注入容器自動創(chuàng)建。查看依賴注入(Dependency Injection)文檔獲取更多信息。

“ASP.NET ABP應(yīng)用服務(wù)有什么用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI