【问题标题】:Creating a static utility class in .net core web API is correct approach?在 .net 核心 Web API 中创建静态实用程序类是正确的方法吗?
【发布时间】:2020-11-30 00:25:50
【问题描述】:

我计划在 asp.net core web api 3.1 应用程序中创建一个通用的实用程序类,用于对字符串进行 base 64 编码和解码。

以下是我的方法

namespace CoreAPI.Utilities
{
    public class Base64
    {
        public static string Base64Encode(string plainText)
        {
            var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
            return System.Convert.ToBase64String(plainTextBytes);
        }
        public static string Base64Decode(string base64EncodedData)
        {
            var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
            return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
        }
    }
}

并从我的控制器中调用相同的方法,如下所示

 [HttpGet("api/clients/{clientid}")] 
 public ClientData GetClientDetails(int clientid)
 {
      string encodedclientdata="TestData" //actually fetched from DB
      string Decodedvalue = Base64.Base64Encode(encodedclientdata);
      //added other logic to return clientData object
 }

现在我怀疑创建静态实用程序会在用户并行访问 api 时产生任何问题?这会产生任何并发问题吗?在 web api / web 应用程序中创建静态类是最佳实践?

如果这是一种错误的方法,我该如何在 .net core web api/web 应用程序中添加通用实用程序方法?请指导我!

【问题讨论】:

  • 关于并发:你的方法是无状态的,没有副作用,所以不会有任何问题。
  • @PeterBons : 使用静态方法是个好习惯吗?
  • 像这样的静态类没有任何问题,所以是的,一般来说,这是一种很好的做法(假设函数不涉及任何状态信息)。静态的问题在于一切都是静态的(类、方法、成员变量、属性)。
  • 互联网上有数千篇关于static 及其工作原理的文章。我建议您至少阅读其中之一。微软自己的 MSDN 是一个不错的起点。
  • 一般来说。我不会使用关键字作为类的名称。它会导致未来的进口问题。就我个人而言,我将静态用于“功能性”例程(一些输入,一些输出没有依赖关系)......你不想让静态疯狂...... ....您需要了解 IoC/DI 原则以及静态如何对 IoC/DI 产生不利影响。请不要静态发疯............我不得不重构代码库,一切都是扩展方法。

标签: c# .net asp.net-core asp.net-web-api asp.net-core-webapi


【解决方案1】:

你可以实现这样的扩展方法:

namespace CoreAPI.Utilities
{
    public static class StringBase64Extensions
    {
        public static string Base64Encode(this string plainText)
        {
            var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
            return System.Convert.ToBase64String(plainTextBytes);
        }
        public static string Base64Decode(this string base64EncodedData)
        {
            var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
            return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
        }
    }
}

并像这样使用它:

 [HttpGet("api/clients/{clientid}")] 
 public ClientData GetClientDetails(int clientid)
 {
      string encodedclientdata="TestData".Base64Encode() //actually fetched from DB
      string Decodedvalue = encodedclientdata.Base64Decode();
      //added other logic to return clientData object
 }

这种扩展方法方法在 c# 中被广泛使用,例如在 System.Linq 中,主要是扩展方法。

【讨论】:

    【解决方案2】:

    扩展方法可能是实现这一点的更好方法(Kuechlin's answer),但这种方式的并行线程也不会有问题,因为您只在方法中使用局部变量。这些局部变量只存在于执行函数的特定线程中,不能从方法块外部访问。

    【讨论】:

      猜你喜欢
      • 2020-07-21
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 2018-09-21
      相关资源
      最近更新 更多