【问题标题】:How to handle common data between classes?如何处理类之间的公共数据?
【发布时间】:2011-12-20 03:12:47
【问题描述】:

情况如下:

我有一堆类都依赖于相同的数据。所以我最终会在我的每个类中复制所有必需的属性并根据需要传递它。

这意味着如果有新要求,我可能不得不向所有使用所述数据的类添加新属性,或者我可能不得不从我声明这些数据的每个类中删除一个属性属性。

我正在开发一个 asp .net 应用程序,它有一个 HTTP 处理程序,它解析查询字符串、获取参数然后将它们分配给我的基类,然后可以将这些参数传递给自定义控件、其他类等。

有没有一种方法可以在每个需要它的类之间共享这些数据,而无需将它们作为每个类的属性包含在内?在这种情况下,什么被认为是最佳做法?

编辑

我倾向于组合解决方案。我希望可能有更好的方法来共享数据,而不必将其作为属性添加到需要它的每个类中。如何创建一个包含我的属性的类并将其分配给我的 HTTP 处理程序中的 HttpContext.Current.Items 对象?然后我可以在整个应用程序中从 HttpContext 访问所需的属性,而不必将属性添加到每个类,想法?使用 HttpContext.Items 对象的优缺点是什么?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    赞成composition over inheritance,给每个需要数据的类一个通用类型的属性:

    public class A
    {
        public Record Data { get; set; }
    }
    
    public class B
    {
        public Record Data { get; set; }
    }
    
    public class Record
    {
        public string FirstName  { get; set; }
        public string LastName { get; set; }
        public string Title { get; set; }
    }
    

    现在每个类中只有一个属性,而不是复制三个属性。此外,您不必必须这么快就创建一个基类来共享这些属性。也就是说:您现在使用组合而不是继承。

    【讨论】:

    • 我看到这种方法的一个问题是多点访问——违反得墨忒耳的法则。我将进入包含的类以获取它们的属性 - Class1.Class2.Property。
    • @Tester:如果疼,不要那样做:-)。说真的,这只是第一步。第二步是确定你必须对这些值做什么,然后将适当的方法放入新类中为你做这件事。但这实际上取决于您的软件的详细信息。
    【解决方案2】:

    最简单的解决方案可能是列出所有类所需的属性,并将它们捆绑到一个单独的类中。然后每个类可以只拥有一个字段/属性来保存新类的实例。

    根据具体情况,您还可以创建两个或三个类,例如,如果它从问题的领域更有意义,或者某些类只需要属性的子集。

    【讨论】:

    • 这是我倾向于的解决方案。我希望可能有更好的方法。如何创建一个包含我的属性的类并将其分配给我的 HTTP 处理程序中的 HttpContext.Current.Items 对象?然后我可以在整个应用程序中从 HttpContext 访问所需的属性,而不必将属性添加到每个类,想法?
    • @Tester 可能是一个解决方案。但是,这将有效地创建一个全局(我认为是会话全局)变量,不是吗?这可能是最好的解决方案,但前提是几乎每个班级都需要它。否则,您只能硬着头皮为每个类提供所需的数据。
    • 如果传递所有这些实例的开销看起来很繁重,您可能需要检查依赖注入和一些框架(尽管这对于这个特定问题来说有点过分了)。
    【解决方案3】:

    定义整合配置数据的配置类。理想情况下,它将使用数据创建(例如,使用静态工厂方法),并且其所有属性都是 const/readonly。

    下一步是决定是否在构建类时传递它,是否拥有一个包含此(这些)配置类或其他选项的全局注册表。我建议阅读 Fowler 的 Dependency Injection 文章,了解这些方法的优缺点以及它们如何影响您的单元测试。

    【讨论】:

      【解决方案4】:

      您可以将属性放入基类并让您的所有类都继承自它。喜欢:

      public class A
      {
           public string Prop1 { get; set; }
           public string Prop2 { get; set; }
           //etc.
      }
      
      public class B : A
      public class C : A
      

      【讨论】:

      • 哎哟。使用继承来允许代码重用是有问题的。它将紧密结合可能几乎没有共同点的类(除了需要相同的一组值/属性)。
      • 问题是属性在不同类型之间共享。它会打破“是”的关系。
      • @Tester:如果类不相关,则将 A 类作为 B 和 C 中的成员。那么它只是组合。
      猜你喜欢
      • 2013-02-18
      • 1970-01-01
      • 2021-10-30
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 2017-11-03
      • 1970-01-01
      相关资源
      最近更新 更多