ASP.NET + C#多项目解决方案。我应该把我的全局效用函数放在哪里?

时间:2009-06-30 08:18:58

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

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

我有一个“核心”项目,其中包含大多数其他项目。

所以我的问题是这个,我有一些实用函数,比如FormatPhoneNumber(..),我希望能够从以下任何地方以下列方式访问。

(在Project_B中取决于Core)

string str = FormatPhoneNumber(inputString);

在最坏的情况下,我想我可以使用某种限定符:

string str = util.FormatPhoneNumber(inputString);

9 个答案:

答案 0 :(得分:4)

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

你必须在某处拥有某种“限定符”(就像你所说的那样),但要减少影响,请使用每个文件顶部的using语句,例如

using util;

答案 1 :(得分:1)

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

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

(我是否提到过§%$& MarkDown编辑器不允许在德语键盘布局上键入[at]符号,因为它会创建一个blockquote?叹气。)

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

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

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

string formattedString =  inputString.FormatPhoneNumber();

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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

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

答案 6 :(得分:0)

您需要将函数放在静态类中。你无法避免资格认证(C#中没有全局函数):

<%= Formatters.PhoneNumber(rawData) %>

应该按照常规方法对效用函数进行分组:类似的方法组合在一起,不相关的方法应该进入不同的类(静态类的事件旨在实现低耦合和高内聚)。

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

答案 7 :(得分:0)

如果您正在实现的功能只能在您的应用程序的上下文中使用,我建议您将它放入Core程序集(例如,在“Utils”之类的单独命名空间下)或应用程序的新DLL库中解。 只有当函数可以在多个项目中使用时,才有必要创建一个实用程序库。但请记住,实用程序库只有在定期维护时才有意义。

答案 8 :(得分:0)

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

FWIW,如果您使用更正式的命名空间作为boris sugguests(建议避免冲突),您可以使用using关键字缩写:

using Util = [CompanyName].Utils.StringHelpers;

我倾向于关注DRY principle并在我需要的时候创建一个别名。