在我的洋蔥架構中,我的 PresentationLayer 包含一個名為 LogRabbitMQFilters 的類,該類具有不同的屬性來過濾搜索。

我通過映射器在 ApplicationLayer 中傳遞 LogRabbitMQFilters :
public RabbitMQController(IELKService iELKService, IMapper mapper)
{
_iELKService = iELKService;
_mapper = mapper;
}
public async Task<IActionResult> Index(int? id, LogRabbitMQFilters filters)
{
var filtersMapped = _mapper.Map<LogRabbitMQFilters>(filters);
var response = await _iELKService.GetLog(filtersMapped);
/*some code.....*/
}
在 ApplicationLayer 中,我將 logRabbitMQFilters 映射到在 Persistance 層中宣告的 RabbitMQFilters,并像這樣呼叫我的存盤庫:
public ELKService(IELKRepository iELKRepository, IMapper mapper)
{
_iELKRepository = iELKRepository;
_mapper = mapper;
}
public async Task<LogResult> GetLog(LogRabbitMQFilters logRabbitMQFilters)
{
var filterMapped = _mapper.Map<RabbitMQFilters>(logRabbitMQFilters);
return await _iELKRepository.GetLogs(filterMapped);
}
這是最好的方法嗎?還有另一種方法可以將我的過濾器類傳遞到存盤庫嗎?我想到了規范模式,但如果這是一個好的解決方案,我現在不會。
uj5u.com熱心網友回復:
關于復雜性,根據其職責或關注點來分解應用程式總是很好的。
考慮到您的代碼,您似乎遵循了行業指定的標準。為了更清晰,我還在此處添加了標準專案架構的示例代碼片段。
Controller:
[Route("api/User")]
[ApiController]
public class UserController : ControllerBase
{
private readonly IUserService _userService;
public UserController(IUserService userService)
{
_userService = userService;
}
[HttpGet]
[Authorize]
[Route("users")]
public async Task<ActionResult> Users()
{
var users = await _userService.GetAllUsers();
return Ok(new ResponseViewModel { output = "success", msg = "request successful", returnvalue = users });
}
}
Service Interface:
public interface IUserService
{
Task<List<UserViewModel>> GetAllUsers();
}
Service Implementation:
public class UserService : IUserService
{
private readonly IUserRepository _userRepository;
public UserService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public async Task<List<UserViewModel>> GetAllUsers()
{
return await _userRepository.GetAllUsers();
}
}
Repository Interface:
public interface IUserRepository
{
Task<List<UserViewModel>> GetAllUsers();
}
Repository Implementation:
public class UserRepository : IUserRepository
{
private readonly AppDbContext _dbContext;
private readonly IMapper _mapper;
public UserRepository(AppDbContext dbContext, IMapper mapper)
{
_dbContext = dbContext;
_mapper = mapper;
}
public async Task<List<UserViewModel>> GetAllUsers()
{
var users = await _dbContext.Users.ToListAsync();
var userViewModel = _mapper.Map<List<UserViewModel>>(users);
return userViewModel;
}
}
Model:
public class UserViewModel
{
public long user_id { get; set; }
public string full_name { get; set; }
}
注意:希望上述步驟相應地指導您。此外,您還可以查看我們的官方檔案,了解有關行業實踐的更多資訊。
uj5u.com熱心網友回復:
DDD 和洋蔥架構共享共同的原則(例如域隔離),但是它們在開發技術方面也有一些不同的方面。應該指出的是,架構和設計應該為我們的目標服務,而不是成為目標本身。
根據您的描述,您似乎有一個 CRUD 風格的系統。我看不到業務規則、領域概念和規范。當然,這并不是一件壞事。
將域與其他層(表示、基礎設施)隔離是有益的,特別是當要應用復雜的驗證并且要在復雜的物體物件中實施業務規則時。但是,在您的情況下,您將普通物件LogRabbitMQFilters(表示層)映射到“自身”(應用層),然后再映射到普通物件RabbitMQFilters(基礎設施層)。在像您這樣的情況下(即使從 DDD/洋蔥的角度來看),將物件按原樣從表示層傳遞到應用程式層是可以的,但是:
- 第二個映射不應該存在,因為基礎設施層知道域,因此應該接收您的(大概)域物體
LogRabbitMQFilters。 LogRabbitMQFilters實際上不是真正的域物體,因為如前所述,它不適用任何業務規則。- 將物件從一層平面映射到另一層似乎毫無意義。
我想到了規范模式,但如果這是一個好的解決方案,我現在不會
當我們想要將運算式打包為業務不變數時,規范模式非常有用,例如,有一個名為ShortMessage(業務不變數)的類封裝了一個運算式,例如Message.Length < 42. 但是對于您的情況,我認為沒有用,由于您的應用程式的 CRUD 性質:您只需接收一些用戶屬性作為表示資料庫表的 ORM 物件的背景關系中的運算元,以便執行以下操作:
myORMManager
.FetchAll<MyTableObject>()
.Filter(record =>
record.DateDebut == filter.DateDebut &&
record.DateFin == filter.DateFin &&
.
.
record.Message == filter.Message
.
.
.
);
由“and”運算子分隔的每個謂詞都可以被視為規范,但是這些規范只是技術性的,因為它們不傳達任何業務不變性。該物件filter實際上可以是客戶端請求。
總之,直接使用客戶端屬性作為資料庫過濾器運算式的運算元來開發單層應用程式是可以接受的,只要業務不變數不在畫面中(或至少具有低復雜性)。如果您仍然想要一個 DDD 框架,即擁有一個應用程式服務(您可以在其中應用簡單的驗證,例如 DateFin > DateDebut)和一個存盤庫物件以及控制器物件,那么我建議使用一個類“walking通過”所有三個物件
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/360887.html
