【问题标题】:Is it good to use a static method and static class to read and write to a json file?使用静态方法和静态类读写json文件好不好?
【发布时间】:2021-05-23 02:48:54
【问题描述】:

我正在尝试写入和读取 JSON 文件。使用静态方法好吗?如何提高这段代码的性能

public static class Service
{
    private static JsonContainer ReadAll()
    {
        using (StreamReader sr = new StreamReader(HttpContext.Current.Server.MapPath(Constants.JsonFilePath)))
        {
            return JsonConvert.DeserializeObject<JsonContainer>(sr.ReadToEnd());
        }         
    }

    private static bool WriteAll(JsonContainer data)
    {
        // serialize JSON directly to a file
        using (StreamWriter file = new StreamWriter(HttpContext.Current.Server.MapPath(Constants.JsonFilePath)))
        {
            JsonSerializer serializer = new JsonSerializer();
            serializer.Serialize(file, data);
            return true;
        }
    }
}

【问题讨论】:

  • 这是一种老式的做法。现代代码会将方法实现为接口的一部分,以便可以注入此服务(或其存根)。此外,HttpContextBase 将被注入而不是通过HttpContext.Current/ 访问
  • 在没有进一步上下文的情况下问“对 X 使用静态方法好不好”就像问“在星期二写代码好不好?”。

标签: c# json asp.net-mvc json.net


【解决方案1】:

A very nice article why to avoid static classes

一些额外的点:

  1. 您不能扩展它们
  2. 您最终会得到所有序列化代码,并且您的代码将变得无法管理。
  3. 你已经把它弄得太笼统了,放弃了所有类型安全
  4. 他们往往违反单一责任原则
  5. 它们阻碍了单元测试
  6. 它们不能被 DI 容器注入

除了Math,我真的想不出任何其他有意义的类(我相信有一些),那是因为这些概念是核心的,不会改变也不会扩展。

任何其他重要的表示都不会从中受益。

【讨论】:

  • "你不能扩展它们" - 但是你不能在 .NET 中扩展你的项目之外的 any 类型 - 你只能从非密封类派生,但是继承不应该被用作 mixins 的替代品,所以第 1 点并不是真正有效的。
  • 你为什么这么认为?我真的很想听听你的意见。密封类以这种方式声明是有原因的。一个抽象类可以被认为是一个 mixin,这取决于定义。所有只是相应地使用的工具。使用静态类是没有充分理由的有效密封。
  • 尽管 C# 是一种现代语言,但它仍然不是围绕 成功之坑 的概念设计的:您已经指出了许多实用和static 方法的理论上的缺点,但 static 方法提供了许多语法和(开发人员的)工作流便利,其中“正确”的做事方式(例如使用单例模式而不是静态方法;任意调用站点的便利,而不是需要向方法添加另一个参数 - 或向上下文类添加成员 - 以便将引用传递给拥有的接口实例等)...
  • ...所以很难争辩“DI无处不在!”当有许多令人信服的替代方案具有自己的优势,并且没有让 DI 在任何应用程序和/或依赖项中工作所需的大量工作时(例如,必须添加对 DI 库的依赖项,必须设置 ConfigureServices ,必须将ClassName.StaticMethod() 引用更改为this.injectedService.StaticMethod()ClassName.DefaultInstance.StaticMethod()(这会使代码不必要地冗长),通过using static 失去访问权限,总是需要额外的(多余的)this 参数...
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 2010-09-29
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2017-07-30
相关资源
最近更新 更多