2011-09-04 10 views
6

Tôi đang làm việc trên ứng dụng web ASP.Net MVC 3 (EF 4.1) được phân tách trong các lớp: Mô hình, Kho lưu trữ, Dịch vụ, Bộ điều khiển, Chế độ xem trong một số trường hợp và Chế độ xem .Nếu một lớp dịch vụ thực thể gọi dịch vụ của một tổ chức khác hoặc kho lưu trữ của nó

Bây giờ câu hỏi của tôi là một trong những phương pháp hay nhất. Nếu một lớp dịch vụ thực thể cần truy cập vào một thực thể khác sử dụng dịch vụ của nó hoặc kho lưu trữ của nó. Ví dụ, giả sử một phương thức dịch vụ cho thực thể A cần cập nhật thực thể B khi A được tạo. Lớp dịch vụ của A có nên sử dụng kho lưu trữ hoặc lớp dịch vụ của B không? Cả hai đều có thể, nhưng thực hành tốt nhất là gì? Cá nhân, tôi muốn một dịch vụ truy cập một dịch vụ khác. Bằng cách đó, nó như là tiếp cận với các phương pháp phát triển hơn để nói.

Trả lời

1

Tôi có xu hướng quay trở lại các nguyên tắc và thực tiễn thường được sử dụng cho các loại quyết định này; DRY (Đừng lặp lại bản thân) và KISS (Keep It Simple, Stupid) có thể được áp dụng ở đây. Trừ khi bạn cần phải lặp lại một số logic như là kết quả của việc bỏ qua lớp dịch vụ của thực thể B, tôi sẽ gọi kho chứa thực thể B trực tiếp từ lớp dịch vụ của tổ chức A.

Nó là một chi tiết nhỏ, nhưng nó có nghĩa là có ít hơn một lớp tham gia (ServiceClassA> RepositoryClassB thay vì ServiceClassA> ServiceClassB> RepositoryClassB) mà làm cho nó một giải pháp đơn giản trong tâm trí của tôi.

HTH

0

Tôi muốn gọi giữa các lớp dịch vụ, vì bạn cũng có thể cần một số logic nghiệp vụ từ một dịch vụ khác. Nhưng hãy cẩn thận để tránh phụ thuộc vòng tròn. Tôi khuyên bạn nên sử dụng tiêm phụ thuộc sẽ giúp bạn tránh các phụ thuộc vòng tròn có thể xảy ra. Cũng nên xem xét để tạo ra các giao diện cho các lớp dịch vụ của bạn và sử dụng giao diện này từ các lớp khách hàng của bạn (thông qua việc triển khai thực hiện cụ thể cho hàm tạo).

Sau đó SericesA của bạn sẽ trông:

class ServiceA : IServiceA 
{ 
    public ResultA Method1() { //some logic }; 
    public void Method2() { //some logic }; 
} 

ServiceB mà phụ thuộc vào ServcieA.

class ServiceB: IServiceB 
{ 
    private IServiceA _serviceA; 
    public ServiceB(IServiceA serviceA) 
    { 
     _serviceA = serviceA; 
    } 

    public ResultB Method() 
    { 
     var result = _serviceA.Method1(); 
     // get result from service A and create and return result for service B 
    } 
}