MVCのユーティリティクラス-ASP.NET


15

だから、今日は、ASP.NET MVCアプリのどこにユーティリティクラスを置くのだろうと思っていましたか?ユーティリティクラスとは、静的であり、機能を実行するためだけに使用されるクラスを意味します。引数としてメールアドレス、件名、本文を受け取るメールを送信するクラスのように。
私はおそらく別のフォルダと名前空間を作成するだけで十分だと思いますが、みんなの意見を得たいと思いました


3
どんなプロジェクトでもユーティリティクラスを作成するのはなぜですか?質問でMVCが選ばれているのはなぜですか?
Oded

1
MVCが構造を強制するため、MVCについて疑問に思っていました。そして、ユーティリティに関しては、誰もがそれらを使用した印象を受けていました:)電子メール送信者コードがあり、それをシステムのさまざまな部分で動作する別のクラスに分割した場合、それはユーティリティクラスではありませんか混乱した?ユーティリティクラスは、コードに結び付けられていないプログラムでかつて再利用可能であると思いました
user60812

私は個人的に...本当に効用関数に収まらないインタフェースIUserNotificationSenderか..だから適切なエラー処理と、SMTP設定などを言うによって抽象化サービスを、電子メールの送信を検討する
最大

@Maxだから、ユーティリティ関数とは何でしょうか?私は非常に混乱しているように見えるので、理解しようとしています
-user60812

さて、私の心の中の適切なユーティリティ関数は、非常に定義されたスコープと外部依存関係のない非常に小さな関数です...空白を削除する、文字列をトリムする、またはコレクションの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);
}

モックとスタブを使用できます。

IoCをに適用してみてくださいCommunicationUtilities。できません。それが壊れている理由です。


こんにちはMainMaです。正しく理解できれば、すべてのパイピングを使用してsayバックグラウンドクラスを作成し、それをインターフェイスで抽象化し、最初のスニペットのようにクラスから直接呼び出すのではなく、インターフェイスを関数に渡します。
user60812

1
@ user60812:要するに、IoCについて読んでください。件名全体を簡単なコメントで説明するのは難しいでしょう。
アルセニムルゼンコ

1
文字列トランケーターのような本当に汎用的なユーティリティ関数はどうですか?
jbyrd

2
@MainMa-すみません、私は従いません。それは私が望むものの線に沿っています、はい。しかし、Truncate()はc#に組み込まれていないため、この種の汎用ユーティリティ関数を何らかのユーティリティクラスに組み込むのが理にかなっているのだろうかと考えていました。
jbyrd

2
この答えは、この特定のケースではutilクラスが必要ないことに注意することで問題を定義します。しかし、一般に、どこにも合わない「ヘルパー」スタイルのメソッドが常にいくつかあります。
USR

9

質問は、例が正しくない場合でも有効です。Mainaによって与えられた答えは、非常に特定のコンテキストでは完璧であり、私にとってはそうではありませんが、「ユーティリティ」クラスの適切なコンテキストです。

個人的には、Helpers拡張機能など、どこからでも呼び出される単純な関数を格納するフォルダーを作成します。この場合、はい、静的です。

今、より良い方法があれば、喜んで学びますが、これまでのところ:

  • 拡張機能に問題はありません。
  • 特定のフォルダにグループ化しても問題はありません。

現在、拡張機能は単なる構文上の砂糖であり、古典的な機能である可能性もあります。


6

以前に与えられた答えはどれも実際の質問に対応していません。user60812は、MVCプロジェクト内のどこにユーティリティクラスを配置するかを尋ねました。誰もが特異な例に耳を傾け、手元の質問以外のすべてについて怒鳴りました。

@ user60812、あなたが望む抽象化のレベルに応じて、私は:

  • A)フォルダーを作成し、そのフォルダー内にユーティリティクラスを作成します
  • B)ユーティリティクラスを保持するプロジェクトを作成します(アセンブリの再利用が必要であると想定)。
  • C)ユーティリティをサービスアーキテクチャに外挿して呼び出します

同様の質問へのリンクと、より良い回答があります。

私見では


1

ユーティリティ用の静的クラスを作成しないでください。ほとんどの場合、静力学は悪いです。マネージャーとも呼ばないでください。どのような作業をしている場合でも、論理的な名前空間に配置する必要があります。

例えば:

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

電子メールアドレス、件名、本文は別の懸念事項であるため、そのためのクラス構造が必要になりEmail emailます。そのため、上記の例で使用したのはなぜですか。


静的クラスがユーティリティメソッドを保持するのに悪い理由を説明してください。私はあなたの推論に関して本当に興味があります。
スペンサーサリバン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.