web-dev-qa-db-ja.com

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

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

16
user60812

あなたはしません。そして、あなた自身の例は、なぜそうでないかを示すのに最適なものです。

メールを送りたいですよね?そのため、静的クラスCommunicationUtilitiesに静的SendEmail()をどこかに作成します。一連の処理を行うクラスからこのメソッドを使用します。たとえば、ユーザーのパスワードをリセットし、新しいパスワードをメールで送信します。完璧です。

では、クラスを単体テストしたい場合はどうなりますか?パスワードをリセットするメソッドをテストするたびに、データベースが変更され(単体テストには適していません)、さらに電子メールが送信されるため(これはさらに悪いことです)。

制御の反転について読んだことがあるかもしれません。これには、単体テストを簡単にする利点があります。 IoCに関する記事では、次のようなことをする代わりに、

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

あなたがやる:

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

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

IoCをCommunicationUtilitiesに適用してみてください。そうですね。それが壊れている理由です。

11

与えられた例がそうでなくても、質問は有効なものです。 Mainaの答えは完璧です。非常に具体的なコンテキストでは、私にとってはそうではありません。前述の"utility"クラスの適切なコンテキストです。

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

さて、より良い方法があれば、私は学ぶことがうれしいですが、これまでのところ:

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

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

9
BernardG

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

@ user60812、必要な抽象化のレベルに応じて、次のようにします。

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

ここにリンクがあります より良い答えを持つ同様の質問へ。

私見では

6

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

例えば:

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

メールアドレス、件名、本文は別の問題なので、そのためのクラス構造があるので、なぜEmail email上記の例では。

1
CodeART