คลาสยูทิลิตี้ใน MVC - ASP.NET


15

ดังนั้นฉันสงสัยในวันนี้คุณจะวางคลาสยูทิลิตี้ในแอพ ASP.NET MVC ที่ไหน โดยยูทิลิตี้ชั้นเรียนฉันหมายถึงคลาสที่สามารถคงที่และใช้เพียงเพื่อทำหน้าที่ เหมือนคลาสที่จะส่งอีเมลที่ใช้ที่อยู่อีเมลหัวเรื่องและเนื้อหาเป็นข้อโต้แย้ง
ฉันจะสมมติว่าอาจสร้างโฟลเดอร์แยกต่างหากและเนมสเปซจะดีพอ แต่ต้องการได้รับความคิดเห็นของทุกคน


3
ทำไมจะสร้างคลาสยูทิลิตี้ในโครงการประเภทใด? ทำไม MVC จึงแยกคำถามของคุณ
Oded

1
ฉันสงสัยเกี่ยวกับ MVC เพราะมันเป็นโครงสร้างที่บังคับ และเท่าที่ยูทิลิตี้ฉันอยู่ภายใต้ความประทับใจที่ทุกคนใช้พวกเขา :) หากฉันมีรหัสผู้ส่งอีเมลและฉันแยกมันเป็นคลาสที่แยกต่างหากเพื่อทำงานกับส่วนต่าง ๆ ของระบบไม่ใช่คลาสยูทิลิตี้หรือ ฉันสับสน? ฉันคิดว่าคลาสยูทิลิตี้ครั้งหนึ่งเคยถูกนำมาใช้ซ้ำในโปรแกรมใด ๆ ที่ไม่ได้ผูกติดอยู่กับรหัส
user60812

ฉันจะพิจารณาอีเมลเป็นการส่วนตัวส่งบริการ, ใจลอยโดยพูดว่าอินเตอร์เฟซ IUserNotificationSender หรือดังนั้น .. ด้วยการจัดการข้อผิดพลาดที่เหมาะสม, smtp config ฯลฯ ที่ไม่เหมาะสมกับฟังก์ชั่นยูทิลิตี้จริงๆ ...
สูงสุด

@ Max ดังนั้นสิ่งที่จะพิจารณาฟังก์ชั่นยูทิลิตี้ ฉันพยายามที่จะเข้าใจดูเหมือนฉันสับสนมาก
60812

ดีฟังก์ชั่นยูทิลิตี้ที่เหมาะสมในใจของฉันเป็นฟังก์ชั่นที่เล็กมากที่มีขอบเขตที่กำหนดไว้มากและไม่มีการพึ่งพาภายนอก ... เช่นฟังก์ชั่นเพื่อลบช่องว่างหรือตัดแต่งสตริงหรือรับองค์ประกอบที่ n ของคอลเลกชัน ...
สูงสุด

คำตอบ:


11

คุณทำไม่ได้ และตัวอย่างของคุณเองนั้นเหมาะอย่างยิ่งที่จะแสดงว่าทำไมถึงไม่

คุณต้องการส่งอีเมลใช่ไหม ดังนั้นคุณจึงสร้างคลาสสแตติกที่CommunicationUtilitiesมีสแตติกSendEmail()อยู่ในนั้น คุณใช้วิธีนี้จากบางคลาสที่ทำสิ่งต่าง ๆ มากมายเช่นรีเซ็ตรหัสผ่านของผู้ใช้และส่งใหม่ทางอีเมล สมบูรณ์

ตอนนี้จะเกิดอะไรขึ้นถ้าคุณต้องการทดสอบหน่วยการเรียนของคุณ คุณทำไม่ได้เพราะทุกครั้งที่คุณต้องการทดสอบวิธีการตั้งรหัสผ่านใหม่มันจะเปลี่ยนฐานข้อมูล (ซึ่งไม่เหมาะสำหรับการทดสอบหน่วย) และยิ่งกว่านั้นจะส่งอีเมล (ยิ่งแย่ลง)

คุณอาจได้อ่านเกี่ยวกับ Inversion of Control ซึ่งมีประโยชน์ในการทำให้การทดสอบหน่วยง่ายขึ้น บทความเกี่ยวกับ IoC จะอธิบายให้คุณทราบว่าแทนที่จะทำสิ่งที่ชอบ:

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

คุณทำ:

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

ซึ่งอนุญาตให้ใช้ mocks และ stubs

พยายามที่จะใช้ IoC CommunicationUtilitiesที่คุณ ใช่คุณทำไม่ได้ นั่นเป็นสาเหตุที่ทำให้มันพัง


สวัสดี MainMa ดังนั้นถ้าฉันเข้าใจอย่างถูกต้องมันยังคงเหมาะสมที่จะสร้างคลาสแบ็คกราวน์ที่มี piping ทั้งหมดและจากนั้นนามธรรมกับอินเตอร์เฟสและส่งผ่านอินเตอร์เฟสไปยังฟังก์ชันแทนการโทรตรงจากคลาสเหมือนกับในตัวอย่างแรกของคุณ
user60812

1
@ user60812: ในระยะสั้นอ่านเกี่ยวกับ IoC เป็นการยากที่จะอธิบายเรื่องทั้งหมดในคอมเม้นท์ง่ายๆ
Arseni Mourzenko

1
ฟังก์ชั่นยูทิลิตี้ทั่วไปอย่างแท้จริงเช่นตัวตัดสตริง
jbyrd

2
@MainMa - ขอโทษฉันไม่ได้ติดตาม นั่นคือสิ่งที่ฉันต้องการใช่ไหม แต่ Truncate () ไม่ได้สร้างไว้ใน c # ดังนั้นฉันจึงสงสัยว่ามันจะเหมาะสมหรือไม่ที่จะใช้ฟังก์ชั่นยูทิลิตี้ประเภทนั้นในคลาสยูทิลิตี้บางประเภท
jbyrd

2
คำตอบนี้กำหนดปัญหาโดยสังเกตว่าในกรณีนี้ไม่จำเป็นต้องใช้คลาส util แต่โดยทั่วไปมักมีวิธีการสไตล์ "ตัวช่วย" ที่ไม่เหมาะกับทุกที่
usr

9

คำถามคือคำถามที่ถูกต้องแม้ว่าตัวอย่างที่ให้มาจะไม่ คำตอบที่ได้รับจาก Maina นั้นสมบูรณ์แบบในบริบทที่เฉพาะเจาะจงซึ่งไม่ใช่สำหรับฉันบริบทที่เหมาะสมสำหรับคลาส"ยูทิลิตี้" ที่กล่าวมา

ส่วนตัวฉันสร้างโฟลเดอร์Helpersที่ฉันใส่ฟังก์ชั่นง่าย ๆ ที่จะเรียกจากที่ใดก็ได้เช่นส่วนขยายในกรณีที่ใช่พวกเขาจะคงที่

ตอนนี้ถ้ามีวิธีที่ดีกว่าฉันจะดีใจที่ได้เรียนรู้ แต่จนถึง:

  • ฉันไม่เห็นสิ่งใดผิดกับส่วนขยาย
  • ฉันไม่เห็นอะไรผิดปกติกับการจัดกลุ่มไว้ในโฟลเดอร์เฉพาะ

ตอนนี้การขยายตัวเป็นเพียงแค่ซินแท็กซ์น้ำตาลก็อาจเป็นฟังก์ชั่นคลาสสิก


6

ไม่มีคำตอบใดที่ให้คำถามที่แท้จริงก่อนหน้านี้ user60812 เพียงแค่ถามว่าใครจะวางคลาสยูทิลิตี้ภายในโครงการ MVC ทุกคนมีตัวอย่างแปลก ๆ และพูดจาโผงผางเกี่ยวกับทุกสิ่งยกเว้นคำถามในมือ

@ user60812 ขึ้นอยู่กับระดับของนามธรรมที่คุณต้องการฉันจะ:

  • A) สร้างโฟลเดอร์และสร้างคลาสยูทิลิตี้ภายในโฟลเดอร์นั้น
  • B) สร้างโครงการเพื่อเก็บคลาสยูทิลิตี้ (สมมติว่าความต้องการนำมาใช้ซ้ำประกอบ)
  • C) ประเมินค่าสาธารณูปโภคของคุณในสถาปัตยกรรมบริการและเรียกพวกเขาออกมา

นี่คือลิงค์ไปยังคำถามที่คล้ายกันพร้อมคำตอบที่ดีกว่า

IMHO


1

อย่าสร้างคลาสสแตติกสำหรับยูทิลิตี้ สถิตยศาสตร์ไม่ดีในกรณีส่วนใหญ่ อย่าเรียกพวกเขาว่าผู้จัดการด้วย ไม่ว่าคุณจะทำงานอะไรก็ตามควรวางไว้ในเนมสเปซแบบลอจิคัล

ตัวอย่างเช่น:

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

ที่อยู่อีเมลหัวเรื่องและเนื้อหาเป็นข้อกังวลแยกต่างหากดังนั้นฉันจะมีโครงสร้างของชั้นเรียนสำหรับเรื่องนั้นด้วยเหตุนี้ฉันจึงใช้Email emailตัวอย่างด้านบน


โปรดอธิบายว่าทำไมคลาสสแตติกคงไม่ดีที่จะเก็บวิธียูทิลิตี้ ฉันอยากรู้จริงๆว่าเหตุผลของคุณคืออะไร
Spencer Sullivan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.