Dịch vụ tên miền như mặt tiền


8

Tôi đã đọc .NET Domain-Driven Design với C #: Problem - Design - Solution và tôi nhận thấy rằng tác giả đã tạo ra một dịch vụ miền cho mỗi gốc tổng hợp.

Tuy nhiên, các dịch vụ miền chỉ là mặt tiền của kho lưu trữ tương ứng. Ví dụ, đây là một mẫu mã từ ứng dụng từ cuốn sách của anh ấy

public static class CompanyService
{
    private static ICompanyRepository repository;
    private static IUnitOfWork unitOfWork;

    static CompanyService()
    {
        CompanyService.unitOfWork = new UnitOfWork();
        CompanyService.repository = 
            RepositoryFactory.GetRepository<ICompanyRepository, 
            Company>(CompanyService.unitOfWork);
    }

    public static IList<Company> GetOwners()
    {
        return CompanyService.GetAllCompanies();
    }

    public static IList<Company> GetAllCompanies()
    {
        return CompanyService.repository.FindAll();
    }

    public static void SaveCompany(Company company)
    {
        CompanyService.repository[company.Key] = company;
        CompanyService.unitOfWork.Commit();
    }

    public static Company GetCompany(object companyKey)
    {
        return CompanyService.repository.FindBy(companyKey);
    }
}

Như bạn thấy hầu hết tất cả các cuộc gọi đến dịch vụ đều là trình bao bọc cho các cuộc gọi kho lưu trữ. Đây có phải là một mô hình tốt khi xây dựng các dịch vụ tên miền?

Chúng ta có nên luôn luôn lưu trữ các kho lưu trữ của chúng tôi trong các dịch vụ tên miền? Có một cách tiếp cận tốt hơn?


Bạn có ý nghĩa gì bởi "tốt hơn"?
Robert Harvey

Câu hỏi tôi sẽ tự hỏi mình ở đây là "Công ty Dịch vụ cung cấp giá trị gì cho Công ty lưu trữ?". Nếu câu trả lời là không có ai là lớp trung lưu - hãy xóa nó đi, không thương tiếc!
MattDavey

@MattDavey trong mẫu mã này Tôi có thể thấy rằng các phương thức kho lưu trữ đã được dịch sang các cuộc gọi tên miền. Ví dụ, GetAllCompanies()kết thúc tốt đẹp repository.FindAll(). Tuy nhiên, tại sao tôi không thể tạo một phương thức lưu trữ repository.GetAllCompanies()thay thế?!
Songo

@Songo: Phụ thuộc vào việc mọi phương thức khác trong Lớp dịch vụ của bạn cũng tương tự kết thúc một cuộc gọi phương thức kho lưu trữ.
Robert Harvey

Câu trả lời:


7

Một kho lưu trữ có nghĩa là một sự trừu tượng cho kho lưu trữ dữ liệu của bạn và thường cung cấp các khả năng truy xuất dữ liệu. Sự sắp xếp này cho phép bạn, ví dụ, thay đổi kho lưu trữ dữ liệu cho một số kho dữ liệu khác nhau (giả sử, từ Oracle sang SQL Server, mặc dù trong thực tế điều này hiếm khi xảy ra) và API kho lưu trữ của bạn vẫn hoạt động, nếu bạn không để lộ bất kỳ chi tiết cụ thể thực hiện.

Mặt khác, một lớp dịch vụ là một API có nghĩa là được sử dụng bởi một số người dùng hoặc đại lý bên ngoài và cung cấp dịch vụ , chứ không phải truy xuất dữ liệu mỗi se (mặc dù nó có thể làm điều đó). API dịch vụ có thể dựa trên nhiều kho lưu trữ và thực hiện các biến đổi trên dữ liệu trước khi cung cấp cho khách hàng. Nó có thể bọc dữ liệu vào các đối tượng tùy chỉnh hoặc cung cấp khả năng phân trang. Bạn có thể thực hiện mọi thứ trong lớp dịch vụ của mình ngoài việc lưu trữ và truy xuất dữ liệu đơn giản.

Nếu bạn không có nhu cầu cung cấp một lớp trừu tượng bổ sung ngoài những gì Kho lưu trữ của bạn cung cấp, bạn hoàn toàn không cần một Lớp dịch vụ.


1
+1 Một điều khiến tôi chú ý trong mã tôi đã đăng. Các SaveCompanyphương pháp đánh dấu đơn vị làm việc. Nếu tôi chỉ sử dụng một kho lưu trữ thì cuộc gọi để cam kết tất cả các thay đổi có trong kho không?
Songo

Vâng, nó sẽ ...
Robert Harvey

2

Khi ứng dụng của bạn phát triển, có các hoạt động phức tạp mà lớp dịch vụ của bạn có thể bao bọc và phơi bày. Đó thực sự là một mặt tiền trên mô hình miền. Ví dụ: trong ứng dụng bán hàng, bạn có thể không quan tâm đến chi tiết đơn hàng dưới dạng đối tượng riêng biệt trong mô hình. Bạn chỉ muốn thêm các mặt hàng vào giỏ hàng, kiểm tra chúng và in hóa đơn cho người dùng sau khi giảm giá được áp dụng.

Đằng sau hậu trường có lẽ có hàng tá đối tượng tham gia vào sự tương tác. Dịch vụ có thể chiếu một khung nhìn phẳng của mô hình đối tượng để khi mô hình miền thay đổi phía sau hậu trường, máy khách không bị tác động bởi những thay đổi đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.