我应该把转换时间函数放在哪里以便在几个控制器中访问它?

时间:2016-10-31 14:37:44

标签: c# asp.net class asp.net-mvc-4

我有一个这样的函数来转换DateTime。

    private static string ToRelativeDate(DateTime dateTime)
    {
        var timeSpan = DateTime.Now - dateTime;

        if (timeSpan <= TimeSpan.FromSeconds(60))
            return timeSpan.Seconds > 5 ? string.Format("{0} sekunder sedan", timeSpan.Seconds) : "Precis nu";

        if (timeSpan <= TimeSpan.FromMinutes(60))
            return timeSpan.Minutes > 1 ? String.Format("{0} minuter sedan", timeSpan.Minutes) : "minut sedan";

        if (timeSpan <= TimeSpan.FromHours(24))
            return timeSpan.Hours > 1 ? String.Format("{0} timmar sedan", timeSpan.Hours) : "timme sedan";

        if (timeSpan <= TimeSpan.FromDays(30))
            return timeSpan.Days > 1 ? String.Format("{0} dagar sedan", timeSpan.Days) : "igår";

        if (timeSpan <= TimeSpan.FromDays(365))
            return timeSpan.Days > 30 ? String.Format("{0} månader sedan", timeSpan.Days / 30) : "månad sedan";

        return timeSpan.Days > 365 ? String.Format("{0} år sedan", timeSpan.Days / 365) : "år sedan";
    }

我现在在控制器中使用它,但我需要在多个控制器中使用它。我应该把它放在哪里(不想复制我的代码),我怎么称呼它?猜它应该在一个分开的班级,但在哪里?我的文件结构是一个标准的asp.net MVC项目。

3 个答案:

答案 0 :(得分:0)

这是一个意见问题,也是您想要分享此代码的广泛程度的问题。

最简单的选择是将它放入另一个类。在MVC项目中,您可以选择将此文件放在任何位置,但是约定建议您将其放在“模型”文件夹中,或者,因为它不是严格的模型而是实用程序函数,您可以创建一个新文件夹“实用程序“代码。该课程可能如下所示:

public class DateUtils
{
  public static string ToRelativeDate(DateTime dateTime)
  {
    //your code here
  }
}

然后在您的控制器中,您只需写下:

string result = DateUtils.ToRelativeDateTime(myDateTimeVar);

(N.B。如果你把你的类放在与控制器不同的命名空间中,那么你需要在控制器类的顶部用using语句包含命名空间。)

如果您想更广泛地共享此功能和其他通用功能,例如,以便您可以轻松地在其他应用程序中重复使用它,您可以为它创建一个完全独立的VS项目,然后将其包含在您的解决方案和参考中它在MVC项目中。这样,您可以在将来在其他解决方案中包含相同的功能,而无需复制文件。

我建议的最后一个选项是将该项目编译成NuGet包(您可以在nuget.org上在线共享,也可以只为自己/团队使用内部文件共享)。这样,您可以在必要时在不同的解决方案中维护多个版本(并在不影响其他开发工作的情况下处理新版本),此外,它还为您提供了一种简单的方法来管理在应用程序中包含可重用代码的方式。

无论您处于何种规模,代码重用的概念本质上都是相同的 - 您将代码抽象并分离到您认为可以设想的所有方案所需的级别,然后共享它使用最简单的方法,可以(安全地)到达所有可能需要它的人。您的目标是编写一次,并在源代码管理中的一个位置维护它/版本,而无需在该处复制/粘贴多个相同的文件。

答案 1 :(得分:0)

要重用代码,您手头有各种技术,扩展方法是最简单的imho:

   public static class ReusableCode
    {    
       private static string ToRelativeDate(this DateTime dateTime)
       {
          //Implementation
       }
    }

<强>用法:

class Class1{
    void Method1(){
        var dateConverted = myDateTime.ToRelativeDate()
    }    
}

请参阅Extention Methods

答案 2 :(得分:-1)

将函数转换为可以注入和重用的服务。

public interface IRelativeDateConverter {
    string ToRelativeDate(DateTime dateTime);
}

public class RelativeDateConverter : IRelativeDateConverter {
    public string ToRelativeDate(DateTime dateTime) {
        //...code removed for brevity
    }
}

使用DI,现在可以在需要时注入和重用服务

public class MyController : Controller {
    private readonly IRelativeDateConvetrer converter;
    public MyController(IRelativeDateConvetrer converter) {
        this.converter = converter;
    }

    //...other code removed for brevity

    public ActionResult MyAction(DateTime value) {
        var relativeDate = converter.ToRelativeDate(value);
        //...other code removed for brevity
    }
}