我有許多可重用的業務邏輯步驟,它們將在各種 Web 端點中重用。我正在嘗試查看 .NET 6 中是否有一種很好的方式來“鏈接”這些可重用的業務邏輯代碼(想想每個類只執行一個邏輯步驟的類)。
這就像 .NET 如何為 Web 應用程式提供“中間件”。僅在這種情況下,我希望點擊一個端點,然后執行我的自定義管道中的所有步驟,并為該端點硬編碼這些步驟。
這是一個高級摘要。
- 每個“流程”都有許多步驟
- 單個端點“呼叫”為特定流程......然后逐步執行每個步驟 - 直到某些業務邏輯未能通過某些檢查 - 這將停止繼續并回傳錯誤訊息或視圖。
例如。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IUserRegistration>(_ =>
{
new MyPipeline()
.AddStep(newUser => ValidateUserData(newUser)) // userData is from the POST request body.
.AddStep(user => CheckIfUserExists(user)) // Check if the user exists in the db
.AddStep(user => CreateUser(user));
});
builder.Services.AddScoped<IEnrollForCourse>(_ =>
{
new MyPipeline()
.AddStep(user => CheckIfUserExists(user)) // Check if the user exists in the db
.AddStep(course => CheckIfTheCourseExists(course)) // Does the uni course, exist?
.AddStep((user, course) => EnrollUserToCourse(user, course));
});
var app = builder.Build();
app.MapPost("/register", async (NewUserModel newUser, IUserRegistration userRegistration) =>
{
var viewResult = await userRegistration.Execute(newUser);
return viewResult; // 200-OK | 400-BadRequest
});
app.MapPost("/enroll", async (EnrollModel enroll, IEnrollForCourse enrollForCourse) =>
{
var viewResult = await enrollForCourse.Execute(enroll);
retyrn viewResult; // 204-NoContent | 400-BadRequest
});
app.Run();
所以上面有很多問題,但那里的一般想法。
這是一個已解決的問題,在 .NET 中已經解決了嗎?這肯定不是新鮮事。
有人可以幫忙嗎?
編輯:當然,我通常只使用帶有 if/else 檢查的單個類 .. 然后呼叫各種業務邏輯。是的,我知道。我們現在有了它,如果感覺真的很大而且很笨拙,我正在嘗試看看是否可以將它重構為更好的、可重用的組件。
另外,我不想使用 Logic Apps .. 這是 Microsft 的一個類似概念。
注意 1:在我被標記為“家庭作業”之前,問題是:這不是。我使用 users/course/uni 等作為演示/問題的簡單示例。
注意 2:我不確定 SO 是否是提出這個問題的正確網站,因為它 - 可能被解釋為過于固執己見。如果是這種情況,是否可以針對該問題更好地針對哪個站點提出建議?
uj5u.com熱心網友回復:
委托序列構建器可能會解決問題。
查看此博客: https ://odetocode.com/blogs/scott/archive/2018/09/17/how-the-next-delegate-works-in-asp-net-core-middleware.aspx
uj5u.com熱心網友回復:
看看 Jimmy Bogard 的 MediatR 庫。您可以使用它來實作帶有驗證器和裝飾器的命令。
https://github.com/jbogard/MediatR
uj5u.com熱心網友回復:
我知道沒有任何開箱即用的庫或庫,但這是我過去使用過的一個示例,并對其進行了擴展。這似乎是您正在尋找的東西,并且有點肘部油脂,它似乎可以作業。
博客文章:https ://jermdavis.wordpress.com/2016/10/03/an-alternative-approach-to-pipelines/
要點:https ://gist.github.com/jermdavis/89f08945923af2f3a4702c559250f805
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/470988.html
下一篇:映射組態檔實體不會創建