【问题标题】:Where shall I put my utilities classes in a ASP.NET MVC3 application?我应该将我的实用程序类放在 ASP.NET MVC3 应用程序中的什么位置?
【发布时间】:2012-03-03 01:28:37
【问题描述】:

我正在使用 C# 和 Razor 在 ASP.NET MVC3 中开发一个 Web 应用程序。

我需要创建一个实用程序类,在其中放置将字符串转换为日期(年、月、日等)的函数。

在 ASP.NET Web 窗体中,我曾经将此类类放在 App_Code 文件夹中。在 MVC 中没有这样的文件夹,我认为 utility classes 既不属于 Models 也不属于 Helpers(我创建的文件夹我在 HTML Helpers 上的扩展)。

我读到将实用程序类放在不同的程序集中是一种很好的做法。我想应该有一个不同的项目来完成这项工作,但我应该创建什么样的项目?一个普通的类库项目对我来说似乎是最合乎逻辑的选择。

但是在我的例子中,我只需要放置一个包含多个方法的类,因此,如果我们忽略可重用性,那么将实用程序类放在我的 MVC3 Web 应用程序中的某个地方不是更合乎逻辑吗?

【问题讨论】:

    标签: asp.net-mvc-3 class-library code-reuse utility-method


    【解决方案1】:

    你不应该有实用程序类。将它们转换为更好的扩展方法。视图模型更好。

    我通常为管道创建一个名为“HtmlHelpers”或“基础设施”的文件夹。

    “通用”文件夹就像垃圾桶恕我直言。你把所有的垃圾都放进去。

    更新

    我会将它放置在 DateTime 的扩展方法中(放置在名为 DateTimeExtensions 的类中,该类放置在名为 Infrastructure 的命名空间中)。

    我会在视图模型内部或生成视图模型时(在控制器中)使用它。

    至于哪个项目,其实并不重要。重要的是你有特定任务(或职责)的小班。

    有些人认为您应该拥有多个职责不同的类库。我不那样做。我为业务逻辑创建了一个 UI 项目和一个项目。但是,我确保这些类实现了一个或多个接口,以便以后能够重构应用程序。 KISS 也应该适用于项目结构,而不仅仅是其中的代码。

    换句话说:我会将我的助手放在名为 Infrastructure 的命名空间中的核心(业务逻辑项目)中。

    【讨论】:

    • 谢谢!我为我的 HTML Helpers 和 ViewModels 使用扩展方法,以便根本不使用 Viewbag,因为我执行单元测试。既然您建议不要使用实用程序类(我在网上阅读了许多辩论),您会在哪里放置一个公开将字符串转换为日期的方法的类,例如通过提取年份?
    • gr8!那你已经走得很远了。我会将它放在DateTime 的扩展方法中(放置在名为DateTimeExtensions 的类中,该类放置在名为Infrastructure 的命名空间中)。我会在视图模型内部或生成视图模型时(在控制器中)使用它。
    • 伟大的组织!但是我忘了补充说我在我的 DataRepository(或 DAL)中使用了这些类,因为创建为应用程序提供数据的数据库的人将所有日期存储为字符串。因此,如果我有一个方法“GetAllProductsCreatedThisYear”,我需要在我的 LINQ 内联函数中将字符串转换为日期的函数。您的组织是否也适用于这种情况?
    【解决方案2】:

    Call it Common 把所有东西都放在那里。

    然后像这些例子一样使用命名空间

    Common.Formatters 常用函数 Common.Foo Common.Bar

    【讨论】:

    • 谢谢!我也考虑过这一点,但由于我们有更多的人在同一个项目上工作,我希望有一个强大而清晰的命名结构,以便在命名空间之外的文件夹之间明确分离关注点
    【解决方案3】:

    您为什么不在项目中创建另一个名为 Utility、Infrastructure 或类似名称的文件夹(例如在 Helpers 文件夹旁边)并将实用程序类放在那里。

    一旦您需要重用它,您可以随时将其移至单独的 DLL(类库项目)。

    【讨论】:

    • 谢谢,这也是我的第一个想法,但由于我认为许多开发人员发现自己处于同样的境地,因此我想就适用于此的任何标准或最佳实践获得更多意见
    【解决方案4】:

    我更喜欢按照此处的建议创建一个名为 Helpers 的文件夹和命名空间: Where can I put custom classes in ASP.NET MVC?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 2011-01-03
      • 2015-10-19
      • 1970-01-01
      • 2012-07-09
      • 2022-01-19
      • 2016-12-08
      相关资源
      最近更新 更多