MVC中的实用程序类-ASP.NET


15

所以我今天想知道,您会将实用程序类放在ASP.NET MVC应用程序的什么位置?实用程序类是指可以静态的类,仅用于执行功能。就像一个类,以电子邮件地址,主题和正文作为参数来发送电子邮件。
我认为也许创建一个单独的文件夹和名称空间就足够了,但是我想让所有人都同意


3
为什么要在任何类型的项目中创建实用工具类?为什么在您的问题中特别提到MVC?
Oded

1
好吧,我想知道MVC,因为它以某种方式强制了结构。至于实用程序,给人的印象是每个人都在使用它们:)如果我有一个电子邮件发件人代码,并且将其分成了单独的类以与系统的各个部分一起使用,那不是实用程序类,还是我感到困惑吗?我认为实用程序类曾经可以在任何未绑定到代码的程序中重用
user60812 2013年

我个人认为电子邮件发送服务,由抽象说接口IUserNotificationSender左右。与正确的错误处理,SMTP配置等并不真正适合在一个效用函数...
马克斯

@Max那么什么才算是实用函数?我想了解一下,在我看来我很困惑
2013年

好吧,在我看来,一个合适的实用程序函数是一个很小的函数,具有非常定义的范围,没有外部依赖性...例如删除空格,修剪字符串或获取集合的第n个元素的函数...
2013年

Answers:


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,您好,如果我正确理解,仍然可以使用所有管道作为背景类,然后使用接口对其进行抽象,然后将接口传递给函数,而不是像您的第一个代码片段那样直接从类进行调用,这是适当的。
user60812 2013年

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在上面的示例中使用了电子邮件。


请解释为什么静态类不好容纳实用程序方法?我真的对你的推理很好奇。
斯潘塞·沙利文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.