MVC yardımcı program sınıfları - ASP.NET


16

Bu yüzden bugün bir ASP.NET MVC uygulamasında yardımcı program sınıflarını nereye koyacağınızı merak ediyordum. Fayda sınıflarına göre statik olabilen ve sadece bir işlevi yerine getirmek için kullanılan sınıfları kastediyorum. E-posta adresini, konuyu ve gövdeyi bağımsız değişken olarak alan bir e-posta gönderen bir sınıf gibi.
Belki ayrı bir klasör oluşturmayı ve ad alanının yeterince iyi olacağını varsayabilirim, ancak herkesin görüşlerini almak istedim


3
Neden herhangi bir projede faydalı sınıflar oluşturalım? MVC sorunuzda neden öne çıkıyor?
Oded

1
MVC'yi merak ediyordum çünkü bir şekilde yapıyı zorlar. Ve yardımcı programa göre, herkesin kullandığı izlenim altındaydım :) Bir e-posta gönderen kodum varsa ve sistemin çeşitli bölümleriyle çalışmak için ayrı bir sınıfa ayırırsam, bir yardımcı program sınıfı veya Kafam karıştı? Ben yarar sınıfları bir kez koduna bağlı olmayan herhangi bir programda yeniden kullanılabilir olduğunu düşündüm
user60812

Şahsen ben bir hizmet işlevine uymayan uygun hata işleme, smtp config vb arayüzü IUserNotificationSender ya da böyle demek ile soyutlanmış bir hizmet gönderme e-posta düşünün ...
Max

@Max o zaman ne bir yardımcı fonksiyon olarak kabul edilir? Anlamaya çalışıyorum, bana öyle geliyor ki çok kafam karıştı
user60812

Aklımdaki uygun bir yardımcı işlev, çok tanımlanmış bir kapsamı olan ve dış bağımlılıkları olmayan çok küçük bir işlevdir ... Beyaz alanı kaldırmak veya bir dizeyi kırpmak veya bir koleksiyonun n.
Max

Yanıtlar:


11

Yapmazsın. Ve kendi örneğiniz neden olmadığını göstermek için mükemmel bir örnek.

E-posta göndermek istiyorsun, değil mi? Böylece, içinde statik CommunicationUtilitiesolan bir yerde statik bir sınıf yaratırsınız SendEmail(). Bu yöntemi, bir grup şey yapan bir sınıftan kullanırsınız, örneğin bir kullanıcının şifresini sıfırlar ve ona e-posta ile yeni bir tane gönderir. Mükemmel.

Şimdi, sınıfınızı birim olarak test etmek isterseniz ne olur? Şifreyi sıfırlayan yöntemi her test etmek istediğinizde, veritabanını değiştirir (bir birim testi için uygun değildir) ve ayrıca bir e-posta (daha da kötüsü) gönderir.

Birim testini kolaylaştırma avantajına sahip olan İnversiyon Kontrolünü okumuş olabilirsiniz. IoC ile ilgili makaleler size şöyle bir şey yapmak yerine şunları açıklayacaktır:

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

Yapmalısın:

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

alay ve taslakların kullanılmasına izin verir.

IoC'nizi uygulamanıza deneyin CommunicationUtilities. Doğru, yapamazsın. Bu yüzden kırıldı.


Merhaba MainMa, bu yüzden doğru anlıyorsam hala tüm boru ile bir söz arka plan sınıfı yapmak ve sonra bir arabirim ile soyut ve ilk snippet'te olduğu gibi sınıftan düz çağrı yerine arabirimi işlevine geçmek için uygundur.
user60812

1
@ user60812: kısaca IoC hakkında bilgi edinin. Tüm konuyu basit bir yorumda açıklamak zor olacaktır.
Arseni Mourzenko

1
String truncator gibi gerçekten genel bir yardımcı program işlevine ne dersiniz?
jbyrd

2
@MainMa - üzgünüm, takip etmiyorum. Bu istediğimin çizgisinde, evet. Ama Truncate () c # yerleşik değildir, bu yüzden bir tür yardımcı programlar sınıfında bu tür genel yarar fonksiyonu sopa için mantıklı olup olmadığını merak ediyordum.
jbyrd

2
Bu cevap, bu özel durumda hiçbir util sınıfının gerekli olmadığını belirterek sorunu tanımlamaktadır. Ancak genel olarak her zaman hiçbir yere uymayan bazı "yardımcı" stil yöntemleri vardır.
usr

9

Soru, verilen örnek olmasa bile geçerli bir sorudur. Maina tarafından verilen cevap, benim için olmayan çok özel bir bağlamda mükemmeldir, adı geçen "faydalı" sınıflar için uygun bağlam .

Şahsen, Helpersuzantılar gibi yaklaşık her yerden çağrılacak basit işlevleri koyduğum bir klasör oluşturuyorum , bu durumda evet, statiktirler.

Şimdi, daha iyi bir yol varsa, öğrenmekten memnuniyet duyarım, ancak şu ana kadar:

  • Uzantılarda yanlış bir şey görmüyorum.
  • Onları belirli bir Klasörde gruplamakta yanlış bir şey görmüyorum.

Şimdi, bir uzantı sadece sintaksik şekerdir, klasik bir fonksiyon da olabilir.


6

Daha önce verilen cevapların hiçbiri asıl soruyu ele almıyor. user60812 basitçe bir MVC projesinin içine bir yardımcı sınıf nereye yerleştireceğini sordu. Herkes tekil örnek üzerinde koştu ve eldeki soru dışında her şeyi sıraladı.

@ user60812, istediğiniz soyutlama düzeyine bağlı olarak:

  • A) Bir klasör oluşturun ve bu klasördeki yardımcı programı oluşturun
  • B) Fayda sınıflarını tutmak için bir proje oluşturun (montajın yeniden kullanılması isteğini varsayarak).
  • C) Yardımcı programlarınızı bir hizmet mimarisine dönüştürün ve onlara çağrı yapın

İşte daha iyi cevapları olan benzer bir soruya bağlantı .

Benim nacizane fikrime göre


1

Yardımcı programlar için statik sınıflar oluşturmayın. Statik çoğu durumda kötüdür. Onlara yönetici de demeyin. Üzerinde çalıştığınız her ne olursa olsun, mantıksal bir ad alanına yerleştirilmelidir.

Örneğin:

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

E-posta adresi, konu ve gövde ayrı bir endişe kaynağıdır, bu nedenle bunun için bir sınıf yapısına sahip olurdum, bu yüzden Email emailyukarıdaki örnekte neden kullandım .


Statik sınıfların fayda yöntemlerini kullanmakta neden kötü olduğunu açıklayınız? Akıl yürütmenizi gerçekten merak ediyorum.
Spencer Sullivan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.