c# - 如何存储/处理 C# 中其他类可用的数据

标签 c# class static

我正在编写 CAD 程序。假设我在输入类中,此类从文本文件中读取各种数据并创建大量列表/字典和......这些数据需要通过其他类中的其他方法访问才能修改。现在这是我到目前为止的做法:

我有一个静态类:Building.cs 当我创建/或加载一个项目时,这个类包含所有数据,如列、梁、点等的列表。所有这些都存储为私有(private)领域。我可以使用类的公共(public)方法(如 GetColumns 或 GetPoints)访问这些...

现在我也有非静态类。它们包含 2-3 个公共(public)方法。并在建筑物的各个部分做一些事情。

public static class Building
{
    private static List<Column> columns;
    private static List<Beams> beams;
    private static List<Points> points;

    public static List<Column> GetColumns() 
    {
        return Columns;
    }
}

public class ColumnsService()
{
    private List<Columns> columns;
    public GroupColumns(List<Columns> columns)
    {
        this.columns = columns;
    }

    public void Group()
    {
        // group columns
    }
}

var columns = Building.GetColumns();
var columnsService = new ColumnsService(columns);
columnsService.Group();

我想知道这是要走的路吗?我还能如何存储数据。大多数类都需要在程序的整个生命周期内访问数据。最佳做法是什么。

最佳答案

从语义上讲,什么是 Building

对我来说,这个名字意味着它是一个结构的实例。也就是说,在整个业务领域中,可以有许多“建筑物”,并且在任何给定时刻,一个人正在与其中一个进行交互。

如果是这样的话,那么对我来说似乎不符合直觉static .如果有多个,它应该是一个实例模型。它将包含描述它的属性和与之交互的操作。在考虑其他对象将如何与它交互之前,被建模的业务域应该驱动这个对象的结构。

因此,假设我们将其设为实例模型:

public class Building
{
    // attributes and operations
}

然后,如您所问,其他对象如何与其交互?

取决于交互。

假设一个对象需要以某种方式“渲染”一座建筑。我们称它为BuildingPrinter因为没有更好的术语。显然它需要一个 Building打印”。所以它需要一个用于该操作:

public class BuildingPrinter
{
    public void Print(Building building)
    {
        // implementation
    }
}

或者您可能有一个以某种方式“包裹”建筑物的对象。没有建筑物就无法有意义地存在的东西,无论执行的操作如何。我想不出那个特定的业务领域,所以我们就称它为 BuildingWidget .因为它需要一座建筑才能存在,所以它需要一个:

public class BuildingWidget
{
    private Building currentBuilding;

    private BuildingWidget() { }

    public BuildingWidget(Building building)
    {
        currentBuilding = building;
    }
}

重点是,从构建整个领域的模型的角度来看,如果需要某些东西,就必须提供它。这些模型不应该去到一些全局数据存储,与该数据存储紧密耦合,以获得他们需要的东西。这称为依赖倒置原则。

但是协调这些模型交互的消费代码将从哪里获得 Building 的实例? ?有许多潜在的解决方案。

两种常见的模式是拥有静态工厂或存储库。例如:

public class BuildingFactory
{
    public static Building FetchBuilding(int buildingId)
    {
        // implementation
    }
}

这个工厂可能有一个静态的缓存构建对象。建筑物本身不是静态的,但出于性能原因,它的一个实例被静态缓存,这样它就不会不断地从后备数据存储(例如数据库)中重新获取。您还可以添加使缓存无效并重新获取的方法,或者将该逻辑封装到工厂本身中(例如总是在 5 分钟后或 10 次访问后或某些其他规则后重新获取)。 (在幕后,这个工厂甚至可能使用如下所示的存储库来重新获取该实例。在这种情况下,您猜对了,BuildingRepository 构造函数需要 BuildingFactory。)

这个工厂对象也可能负责根据某些规范创建建筑物,例如,如果您有理由制作 Building构造函数私有(private)。

或者,要重新获取数据,请考虑存储库:

public class BuildingRepository
{
    public Building GetBuilding(int buildingId)
    {
        // fetch from database
    }

    public Building SaveBuilding(Building building)
    {
        // save to database, return updated version
    }
}

然后域中的其他代码(包括消费代码)可以使用这些对象来获取/保存建筑物。工厂是静态的,因此可以在任何地方调用。存储库是实例,但不需要在全局上是不同的,因此可以在任何地方实例化(或从依赖注入(inject)容器中提取)。

关于c# - 如何存储/处理 C# 中其他类可用的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27568795/

相关文章:

c# - 当每个任务都依赖于特定事件时的任务链

c# - 使用 C# 与 Reporting Services 交互

c++ - 为什么在类声明之外不允许使用 virtual 和 static 关键字?

c++ - gdb 打印命令中自静态包含字符串子类的递归输出

c# - C# XAMARIN.FORMS 中的超链接按钮

c# - 如何从一个类的多个属性生成一个数组

javascript - 访问 Javascript ES6 类中声明的函数(ES2015?ES16?)

c++ - C++ 中带有 <class Comparable> 的模板

c++ - 用户定义类的运算符重载在 C++ 中不起作用

java - 关于静态变量