Các lớp tiện ích trong MVC - ASP.NET


14

Vì vậy, hôm nay tôi đã tự hỏi, bạn sẽ đặt các lớp tiện ích trong một ứng dụng ASP.NET MVC ở đâu? Theo các lớp tiện ích, ý tôi là các lớp có thể tĩnh và chỉ được sử dụng để thực hiện một chức năng. Giống như một lớp để gửi email lấy địa chỉ email, chủ đề và nội dung làm đối số.
Tôi cho rằng có thể tạo một thư mục riêng và không gian tên sẽ đủ tốt, nhưng muốn lấy ý kiến ​​của mọi người


3
Tại sao sẽ tạo các lớp tiện ích trong bất kỳ loại dự án? Tại sao MVC được chọn ra trong câu hỏi của bạn?
Oded

1
Vâng, tôi đã tự hỏi về MVC bởi vì nó theo một cách buộc cấu trúc. Và theo như tiện ích, tôi có ấn tượng là mọi người đều sử dụng chúng :) Nếu tôi có mã người gửi email và tôi chia nó thành lớp riêng biệt để làm việc với các phần khác nhau của hệ thống, đó không phải là lớp tiện ích hay là Tôi đã bối rối? Tôi nghĩ rằng các lớp tiện ích đã từng có thể sử dụng lại trong bất kỳ chương trình nào không được gắn vào mã
user60812

Cá nhân tôi sẽ xem xét việc gửi email một dịch vụ, được tóm tắt bằng cách nói giao diện IUserNotificationSender hoặc như vậy .. với cách xử lý lỗi thích hợp, smtp config, v.v. không thực sự phù hợp với chức năng tiện ích ...
Tối đa

@Max vậy cái gì sẽ được coi là một chức năng tiện ích? Tôi đang cố gắng để hiểu, vì dường như đối với tôi, tôi rất bối rối
user60812

Chà, một chức năng tiện ích phù hợp trong tâm trí tôi là một hàm rất nhỏ với phạm vi rất xác định và không có phụ thuộc bên ngoài ... Chẳng hạn như một hàm để xóa khoảng trắng, hoặc cắt một chuỗi hoặc lấy phần tử thứ n của bộ sưu tập ...
Tối đa

Câu trả lời:


11

Bạn không. Và ví dụ của riêng bạn là một ví dụ hoàn hảo để chỉ ra tại sao không.

Bạn muốn gửi email, phải không? Vì vậy, bạn tạo ra một nơi nào đó một lớp tĩnh CommunicationUtilitiesvới một tĩnh SendEmail()trong đó. Bạn sử dụng phương thức này từ một số lớp thực hiện một loạt các công cụ, ví dụ như đặt lại mật khẩu của người dùng và gửi cho anh ta một mật khẩu mới qua email. Hoàn hảo.

Bây giờ, điều gì xảy ra nếu bạn muốn kiểm tra đơn vị lớp học của bạn? Bạn không thể, bởi vì mỗi khi bạn muốn kiểm tra phương thức đặt lại mật khẩu, nó sẽ thay đổi cơ sở dữ liệu (không phù hợp với kiểm tra đơn vị) và hơn nữa sẽ gửi email (thậm chí còn tệ hơn).

Bạn có thể đã đọc về Inversion of Control, có lợi ích giúp việc kiểm tra đơn vị dễ dàng hơn. Các bài viết về IoC sẽ giải thích cho bạn rằng thay vì làm một cái gì đó như:

void ResetPassword(UserIdentifier userId)
{
    ...
    new MailSender().SendPasswordReset(userMail, newPassword);
}

bạn làm:

void ResetPassword(IMailSender sender, UserIdentifier userId)
{
    ...
    sender.SendPasswordReset(userMail, newPassword);
}

cho phép sử dụng giả và sơ khai.

Hãy thử áp dụng IoC cho bạn CommunicationUtilities. Phải, bạn không thể. Đó là lý do tại sao nó bị hỏng.


Xin chào MainMa, vì vậy nếu tôi hiểu chính xác thì vẫn nên tạo một lớp nền nói với tất cả các đường ống, sau đó trừu tượng hóa nó bằng một giao diện và chuyển giao diện cho hàm thay vì gọi thẳng từ lớp như trong đoạn trích đầu tiên của bạn.
dùng60812

1
@ user60812: tóm lại, hãy đọc về IoC. Sẽ rất khó để giải thích toàn bộ chủ đề trong một bình luận đơn giản.
Arseni Mourzenko

1
Điều gì về một chức năng tiện ích thực sự chung chung, như một bộ cắt chuỗi?
jbyrd

2
@MainMa - xin lỗi, tôi không làm theo. Đó là những gì tôi muốn, vâng. Nhưng Truncate () không được tích hợp vào c #, vì vậy tôi đã tự hỏi liệu nó có hợp lý khi gắn loại chức năng tiện ích chung đó trong một số loại tiện ích không.
jbyrd

2
Câu trả lời này xác định vấn đề bằng cách lưu ý rằng trong trường hợp cụ thể này, không có lớp sử dụng nào là cần thiết. Nhưng nói chung, luôn có một số phương pháp kiểu "người trợ giúp" không phù hợp với bất cứ nơi nào.
usr

9

Câu hỏi là một câu hỏi hợp lệ, ngay cả khi ví dụ đưa ra là không. Câu trả lời được đưa ra bởi Maina là hoàn hảo, trong một bối cảnh rất cụ thể, không phù hợp với tôi, bối cảnh thích hợp cho các lớp "tiện ích" đã nói .

Cá nhân, tôi tạo một thư mục Helperstrong đó tôi đặt các hàm đơn giản được gọi từ mọi nơi, như các phần mở rộng, trong trường hợp đó, vâng, chúng là tĩnh.

Bây giờ, nếu có một cách tốt hơn, tôi sẽ rất vui khi học, nhưng cho đến nay:

  • Tôi thấy không có gì sai với Tiện ích mở rộng.
  • Tôi thấy không có gì sai khi nhóm chúng trong một Thư mục cụ thể.

Bây giờ, một phần mở rộng chỉ là đường cú pháp, nó cũng có thể là một chức năng cổ điển.


6

Không có câu trả lời nào trước đây đưa ra câu hỏi thực tế. user60812 chỉ cần hỏi nơi người ta sẽ đặt một lớp tiện ích bên trong một dự án MVC. Mọi người đều nghe theo ví dụ số ít và ca ngợi về tất cả mọi thứ trừ câu hỏi trong tầm tay.

@ user60812, tùy thuộc vào mức độ trừu tượng mà bạn muốn, tôi sẽ:

  • A) Tạo một thư mục và tạo lớp tiện ích trong thư mục đó
  • B) Tạo một dự án để giữ các lớp tiện ích (giả sử mong muốn tái sử dụng lắp ráp).
  • C) Ngoại suy các tiện ích của bạn thành một kiến ​​trúc dịch vụ và gọi cho chúng

Đây là một liên kết đến một câu hỏi tương tự với câu trả lời tốt hơn.

IMHO


1

Đừng tạo các lớp tĩnh cho các tiện ích. Thống kê là xấu trong hầu hết các trường hợp. Đừng gọi họ là quản lý. Bất cứ điều gì bạn đang làm việc, nó nên được đặt trong một không gian tên logic.

Ví dụ:

namespace Application.Notifications.Email
{
   public interface ISendEmailCommand
   {
      void Execute(Email email);
   }
}

Địa chỉ email, chủ đề và cơ thể là một mối quan tâm riêng biệt, do đó tôi sẽ có một cấu trúc lớp cho điều đó, do đó tại sao tôi đã sử dụng Email emailtrong ví dụ trên.


Hãy giải thích tại sao các lớp tĩnh là xấu để giữ các phương thức tiện ích? Tôi thực sự tò mò về lý luận của bạn.
Spencer Sullivan
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.