我应该把转换时间函数在几个控制器访问它

本文关键字:几个 控制器 访问 转换 时间 函数 我应该 | 更新日期: 2023-09-27 18:15:36

我有一个这样的函数来转换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";
    }

我在我现在使用ut的控制器中有它但我需要在多个控制器中使用它。我应该把它放在哪里(不想重复我的代码),我该如何调用它?我猜应该在一个单独的班级,但是在哪呢?我的文件结构是标准的asp.net MVC项目

我应该把转换时间函数在几个控制器访问它

这是一个观点问题,也是一个您希望将此代码共享到多大范围的问题。

最简单的选择是将其放入另一个类中。在MVC项目中,您可以选择将该文件放在任何地方,但惯例建议您将其放在"Models"文件夹中,或者,由于它不是严格意义上的模型,而是实用程序函数,因此您可以为"utility"代码创建一个新文件夹。该类可以像这样:

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

然后在你的控制器中,你可以简单地写:

string result = DateUtils.ToRelativeDateTime(myDateTimeVar);
(注意:

如果将类放在与控制器不同的名称空间中,则需要在控制器类的顶部使用using语句包含该名称空间。

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

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

代码重用的概念本质上是相同的,无论你处于什么规模——你抽象和分离代码到你认为所有场景都需要的级别,然后使用最简单的方法共享它,允许它(安全地)到达所有可能需要它的人。您的目标是编写一次,并在源代码管理的一个地方维护它/版本它,而不需要在该地方复制/粘贴多个相同的文件。

要重用代码,您可以使用多种技术,而扩展方法是所有技术中最简单的:

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

用法:

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

参见扩展方法

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

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
    }
}