2010-02-17 41 views
9

Trong ứng dụng ASP.NET MVC của tôi, tôi có một dự án chứa tất cả lớp logic/dịch vụ nghiệp vụ. Dự án này tương tác với Cơ sở dữ liệu của tôi (khung Entity) nằm trong một dự án riêng biệt.Lớp dịch vụ ứng dụng dưới dạng lớp tĩnh

Tôi muốn truy cập dễ dàng vào lớp dịch vụ, vì vậy tôi đã tạo các lớp tĩnh trong đó để chúng có thể được tham chiếu dễ dàng. Ví dụ, nếu anh ở trên điều khiển của tôi và tôi cần phải tạo một tài khoản mới:

ServiceLayer.Accounts.CreateAccount(userName, passWord) //etc.. 

Lớp dịch vụ thì không tất cả các logic cần thiết, sau đó tạo cho người sử dụng thông qua kho lưu trữ trong DatabaseLayer.

private static AllRepos _Repos; 
    private static AllRepos Repos { 
     get 
     { 
      if(_Repos == null) 
       _Repos = new AllRepos(); 

      return _Repos 
     } 
    } 

    public static void CreateAccount(string username, password) 
    { 
     string salt = GenerateSalt(); 
     Account newAccount = DatabaseLayer.Models.Account 
       { 
       Name = username, 
       Password = HashPassword(password, salt), 
       Salt = salt 
       }; 
     Repos.AddAccount(newAccount);  
    } 

Bởi vì tôi không muốn làm như sau ở khắp mọi nơi trong lớp dịch vụ của tôi:

AccountRepository Accounts = new DatabaseLayer.AccountRepository(); 

tôi thay vì tạo ra một lớp wrapper cho các kho của tôi vì vậy mà tôi chỉ phải nhanh chóng nó một lần để sử dụng tất cả các kho lưu trữ khác.

public class AllRepos 
{ 

    private AccountRepository _Accounts; 

    public AccountRepository Accounts 
    { 
     get 
     { 
      if (_Accounts== null) 
       _Accounts= new AccountRepository(); 

      return _Accounts; 
     } 
    } 

    // the same is done for every other repository (currently have about 10+) 
    } 

Được sử dụng trong lớp tĩnh của lớp dịch vụ.

Bởi vì tất cả các lớp lớp dịch vụ của tôi là tĩnh và trường Repos cũng tĩnh, vấn đề hiển nhiên tôi gặp phải là nơi cùng một đối tượng được truy xuất từ ​​nhiều datacontexts gây ra các hành vi lạ cho việc cập nhật/xóa.

Tôi hiểu rằng điều này được mong đợi nếu tôi sử dụng các thành viên/lớp tĩnh như tôi đã làm trong vòng đời của ứng dụng, nhưng có cách nào để có thể sử dụng lớp dịch vụ là ServiceLayer.Accounts.Method() mà không cần phải tạo một lớp không tĩnh cần được khởi tạo ở mọi nơi nó được sử dụng và không gặp phải các vấn đề CRUD do nhiều cá thể datacontext?

+0

"trên thực tế, một số phương pháp trợ giúp tốt nhất là tĩnh" Khái niệm "tốt nhất" của bạn là gì? –

Trả lời

15

Cách tiếp cận của bạn đối với điều này thực sự không phải là đề xuất. Cá nhân tôi sẽ không bao giờ cho phép kiểu tiếp cận này trong nhóm của tôi. Những nhược điểm:

  1. vấn đề luồng chính, như bạn đang trải qua, mà không phải là đơn giản để giải quyết
  2. Bạn không thể kiểm tra điều này rất dễ dàng chút nào.
  3. trừu tượng không thực tế của truy cập dữ liệu của bạn

Lý do lớn nhất để tạo ra các trường hợp của kho là để bạn có thể tiêm phụ thuộc nếu bạn cần. Đối số nổi tiếng nhất cho điều này là để kiểm tra đơn vị để bạn có thể giả lập các phụ thuộc, nhưng tôi đã xây dựng một số kho lưu trữ có phụ thuộc giao diện thay đổi mã sản xuất.

Bạn chỉ đơn giản là nên làm cho bản sao lưu trữ của bạn như một phần của các lớp dịch vụ cơ sở của bạn.Không có lý do gì phải là "tĩnh HOẶC cuộc gọi mẫu ở mọi nơi". Nên có mã instantiation instance trong các lớp cơ sở.

+0

Cũng muốn thêm rằng tôi đã gặp sự cố khi chuyển sang MSDTC khi sử dụng lớp tĩnh giữa bộ điều khiển và dịch vụ – DevDave

10

Tôi không chắc chắn lý do tại sao bạn quá chết khi sử dụng các phiên bản. Bên cạnh thực tế là mã bạn có bây giờ là không cần thiết phức tạp, sử dụng các loại tĩnh cũng làm cho nó khó khăn hơn để kiểm tra đơn vị. Kiểu tĩnh giống như một singleton mà bạn không thể giả lập/thay thế. Dường như với tôi rằng câu hỏi thực sự của bạn có thể là, "Làm cách nào để quản lý trường hợp của lớp dịch vụ của tôi?" Thông thường, bạn làm điều này bằng cách có một cá thể cho mỗi yêu cầu Web. Trong ứng dụng ASP.NET MVC, bạn có thể new up a DI container via a ControllerFactory, and handle all of this. [PDF]

1

Bạn cần phải xử lý phạm vi của ObjectContext của bạn một cách cố ý, như làm một Unit Of Work pattern

Bên cạnh đó, tôi nghĩ rằng bạn nên xem xét lại làm tất cả mọi thứ tĩnh, như womp nói rằng bạn có được khớp nối rất cao, và làm cho nó rất khó để kiểm tra, và bạn có thể nhận được rất nhiều sự trợ giúp để quản lý biểu đồ phụ thuộc bằng cách sử dụng một thùng chứa IOC.

tôi có thể nói điều này, sau khi đốt cháy bản thân mình làm điều đó loại điều trước đây :)

-3

Singletons (và các lớp học tĩnh như mô tả) là ác và nên tránh bằng mọi giá đặc biệt trong Web Apps.

+0

tôi không đồng ý với điều đó, Phương thức của trình trợ giúp là lý tưởng khi tĩnh. infact một số phương pháp trợ giúp tốt nhất là tĩnh để sử dụng web. Yêu cầu, Server.MapPath, Tệp/Thư mục, v.v ... – Mike

Các vấn đề liên quan