Tôi vẫn còn nhớ ngày xưa tốt đẹp của kho. Nhưng kho lưu trữ được sử dụng để phát triển xấu xí theo thời gian. Sau đó, CQRS có dòng chính. Họ thật tuyệt, họ là một luồng không khí trong lành. Nhưng gần đây tôi đã tự hỏi mình nhiều lần tại sao tôi không giữ logic đúng trong phương thức Hành động của Trình điều khiển (đặc biệt là trong Web Api, nơi hành động là một loại trình xử lý truy vấn / lệnh riêng).
Trước đây tôi đã có một câu trả lời rõ ràng cho điều đó: Tôi làm điều đó để kiểm tra vì thật khó để kiểm tra Trình điều khiển với tất cả những người độc thân không thể thay đổi và cơ sở hạ tầng ASP.NET xấu xí nói chung. Nhưng thời thế đã thay đổi và các lớp cơ sở hạ tầng ASP.NET ngày nay kiểm tra đơn vị thân thiện hơn nhiều (đặc biệt là trong ASP.NET Core).
Đây là một lệnh gọi WebApi điển hình: lệnh được thêm vào và các máy khách SignalR được thông báo về nó:
public void AddClient(string clientName)
{
using (var dataContext = new DataContext())
{
var client = new Client() { Name = clientName };
dataContext.Clients.Add(client);
dataContext.SaveChanges();
GlobalHost.ConnectionManager.GetHubContext<ClientsHub>().ClientWasAdded(client);
}
}
Tôi có thể dễ dàng kiểm tra đơn vị / giả nó. Hơn nữa, nhờ có OWIN tôi có thể thiết lập các máy chủ WebApi và SignalR cục bộ và thực hiện kiểm tra tích hợp (và khá nhanh bằng cách này).
Gần đây tôi cảm thấy ngày càng ít động lực để tạo ra các trình xử lý Lệnh / Truy vấn cồng kềnh và tôi có xu hướng giữ mã trong các hành động Api trên Web. Tôi tạo một ngoại lệ chỉ khi logic được lặp lại hoặc nó thực sự phức tạp và tôi muốn cô lập nó. Nhưng tôi không chắc là tôi có làm đúng ở đây không.
Cách tiếp cận hợp lý nhất để quản lý logic trong một ứng dụng ASP.NET hiện đại điển hình là gì? Khi nào thì hợp lý để chuyển mã của bạn sang trình xử lý Lệnh và Truy vấn? Có mô hình nào tốt hơn không?
Cập nhật. Tôi tìm thấy bài viết này về phương pháp DDD-lite. Vì vậy, có vẻ như cách tiếp cận của tôi về việc chuyển các phần mã phức tạp sang các trình xử lý lệnh / truy vấn có thể được gọi là CQRS-lite.