【问题标题】:ASP.NET + C# Multi-Project Solution. Where should I put my global utility functions?ASP.NET + C# 多项目解决方案。我应该把我的全局效用函数放在哪里?
【发布时间】:2010-11-06 22:30:48
【问题描述】:

正如标题所说,我有一个多项目解决方案。

我有一个加载了大多数其他项目的“核心”项目。

所以我的问题是,我有一些实用功能,例如 FormatPhoneNumber(..),我希望能够从任何地方以下列方式访问它们。

(在依赖于 Core 的 Project_B 中)

string str = FormatPhoneNumber(inputString);

在最坏的情况下,我想我可以忍受某种限定词:

string str = util.FormatPhoneNumber(inputString);

【问题讨论】:

  • 附带说明,您可能没有注意到,您可以创建项目文件夹(可以或不能映射到磁盘上的文件夹)。我倾向于将 Utils 库放在 Utils 文件夹中,将 Service 库放在 Lib 文件夹中等等。
  • 感谢所有贡献时间回答这个问题的人......非常感谢。

标签: c# .net asp.net variables scope


【解决方案1】:

最好的方法是创建一个 dll 项目(可能称为“CommonCode”之类的东西?),然后您可以从所有其他项目中引用此 dll 并访问其中的类和方法。

您必须在某处使用某种“限定符”(如您所说),但为了减少影响,请使用每个文件顶部的 using 语句,例如

using util;

【讨论】:

  • 我宁愿说“不要使用 using”作为一般准则。特别是如果您以这种方式导入一组不相关的实用程序类。你有长名称的智能感知。除此之外,你的答案很好。
  • 我通常倾向于将真正的实用程序完全留在命名空间之外——.NET 类的扩展通常也很重要
【解决方案2】:

如果您使用的是 C# 3.0,您可以将它们全部绑定到一个静态类中,将它们用作扩展方法

【讨论】:

  • 但请注意关于何时应使用扩展方法的指南:仅当它属于目标类的成员时(如果您自己编写目标类型)。
  • 您仍然必须将它们放在某个类中并在项目之间共享。除非您使用它们的命名空间,当然还有引用,否则扩展方法将不起作用。此外,通过限制自己使用扩展方法,您没有自己的设计。人们确实需要课程。
  • 我认为格式化字符串的字符串扩展方法会很好。为一个专用于另一个类的函数创建一个单独的类是没有意义的,尤其是当唯一的参数和返回值都是该其他类型时。
【解决方案3】:

.NET 中没有全局函数,因此您必须将实用函数放入一个类中。您可以将方法设为静态,这样您就可以调用它们而无需实例化实用程序类:

public class Utility
{
  public static string FormatPhoneNumber(string input)
  {
    ...
  }
}

// usage:
string output = Utility.FormatPhoneNumber(input);

将这些方法放入您的核心库或可供所有其他库和应用程序使用(引用)的单独实用程序库中。

【讨论】:

    【解决方案4】:

    您需要将函数放在静态类中。您无法避免限定(C# 中没有全局函数):

    <%= Formatters.PhoneNumber(rawData) %>
    

    效用函数应按常规方法分组:相似的方法放在一起,不相关的方法应放在不同的类中(静态类的事件旨在低耦合和高内聚)。

    各自所属的程序集应该是显而易见的:仅由表示层(ASP.NET 项目本身)使用的格式化函数属于那里。真正常见的功能可以进入核心。

    【讨论】:

      【解决方案5】:

      如果你真的必须拥有这样的实用功能(你知道,你不应该,但有时这是最好/最简单的解决方案),我建议将它们放在核心中(假设每个项目都依赖于核心),或在单独的实用程序程序集中。如果您不想放置一个单独的程序集,请考虑使用 ILMerge。

      限定符应该没有问题。我建议不要将不相关的函数放入 Utils 类中,而是使用例如用于所有格式化功能的 Formatting 类。另一方面,正如 s_ruchit 同时建议的那样,扩展方法(例如用于字符串类)也可能会派上用场。

      (我有没有提到这个 §%$& MarkDown 编辑器不允许在德语键盘布局上输入 [at] 符号,因为它会创建一个块引用?叹息。)

      【讨论】:

        【解决方案6】:

        尝试创建自己的实用程序库。
        创建一个类库项目并将您的实用程序类放在那里。

        我自己尝试遵守 [companyName].Util.[subdomain] 之类的命名约定 您的示例可能适合我的 [CompanyName].Utils.StringHelpers

        然后您将使用静态方法 FormatPhoneNumber 创建一个静态类 StringHelper。 您会看到这些个人图书馆迅速变大。如果您只需要函数的子集,则通过对它们进行分组,您不必加载所有代码。

        【讨论】:

          【解决方案7】:

          如果您正在实现的功能只能在您的应用程序的上下文中使用,我建议您将其放入核心程序集(例如在单独的命名空间下,例如“Utils”)或您应用程序的新 DLL 库解决方案。 只有当该函数可以跨多个项目使用时,创建实用程序库才有意义。但请始终牢记,实用程序库只有在定期维护时才有意义。

          【讨论】:

            【解决方案8】:

            如果您希望所有代码都访问这些方法,请使用扩展方法,否则我会使用核心程序集中的 Util 类。

            FWIW,如果您按照 boris 的建议遵循更正式的命名空间(建议避免冲突),您可以使用 using 关键字进行缩写:

            using Util = [CompanyName].Utils.StringHelpers;
            

            我倾向于关注DRY principle,并在我多次需要时立即创建一个别名。

            【讨论】:

              【解决方案9】:

              使用扩展方法可以更方便地调用方法而不使用类名。

              public static class Util {
                  public static string FormatPhoneNumber(this string input) {
                      :
                  }
              }
              

              该方法现在将出现在每个字符串对象上。您不需要知道它来自哪个类。但是,如果扩展类在另一个命名空间中声明,您仍然必须导入该命名空间。

              string formattedString =  inputString.FormatPhoneNumber();
              

              【讨论】:

                猜你喜欢
                • 2015-03-17
                • 1970-01-01
                • 2014-03-19
                • 1970-01-01
                • 1970-01-01
                • 2012-12-14
                • 2020-09-30
                • 2019-07-11
                • 1970-01-01
                相关资源
                最近更新 更多