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

C# 如何在c中存储/处理其他类可用的数据#,c#,class,static,C#,Class,Static,我正在写一个CAD程序。假设我有一个输入类,这个类从一个文本文件中读取各种数据,并创建许多列表/字典和。。。。这些数据需要通过要修改的其他类中的其他方法访问。现在,我是如何做到这一点的: 我有一个静态类:Building.cs当我创建/或加载一个项目时,这个类保存所有数据,如柱、梁、点等的列表。所有这些都存储为私有字段。我可以使用类的公共方法(如GetColumns或GetPoints)来访问它们 现在我也有了非静态类。它们包含2-3个公共方法。在大楼的各个部分做些事情 public stati

我正在写一个CAD程序。假设我有一个输入类,这个类从一个文本文件中读取各种数据,并创建许多列表/字典和。。。。这些数据需要通过要修改的其他类中的其他方法访问。现在,我是如何做到这一点的:

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

现在我也有了非静态类。它们包含2-3个公共方法。在大楼的各个部分做些事情

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();
公共静态类建筑
{
私有静态列表列;
私有静态列表梁;
私有静态列表点;
公共静态列表GetColumns()
{
返回列;
}
}
公共类ColumnsService()
{
私有列表列;
公共组列(列表列)
{
this.columns=列;
}
公共无效组()
{
//组列
}
}
var columns=Building.GetColumns();
var columnsService=新columnsService(列);
columnsService.Group();

我在想这是不是该走的路?我还可以如何存储数据。大多数类都需要在程序的整个生命周期中访问数据。最佳实践是什么。

从语义上讲,什么是
建筑

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

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

我们假设它是一个实例模型:

public class Building
{
    // attributes and operations
}
然后,正如您所问的,其他对象如何与之交互

这取决于相互作用

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

public class BuildingPrinter
{
    public void Print(Building building)
    {
        // implementation
    }
}
或者,您可能有一个对象以某种方式“包裹”建筑。没有建筑就不能有意义地存在的东西,不管执行什么操作。我想不出一个适用于特定业务领域的工具,所以让我们称之为
BuildingWidget
。因为它需要一座建筑物才能存在,所以它需要一座:

public class BuildingWidget
{
    private Building currentBuilding;

    private BuildingWidget() { }

    public BuildingWidget(Building building)
    {
        currentBuilding = building;
    }
}
问题是,从构建整个领域的模型的角度来看,如果需要某些东西,那么必须提供它。这些模型不应该为了得到它们所需要的东西而进入某个全局数据存储,与该数据存储紧密耦合。这就是所谓的依赖倒置原则

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

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

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

如果您有理由将
建筑
构造函数设置为私有,则此factory对象还可能负责根据某些规范创建建筑

<>或者,从数据中重新获取,考虑一个存储库:

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

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

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

只需将它们公开即可。不必费心使用其他get方法。如果您不想在类外更改,请将其设置为属性,并将
集设置为私有。我担心,这有点像是一种为值设置一个静态全局位置的做法,实际上就是将所有内容都放在全局范围内。不太理想。至于如何访问它们,听起来这已经起作用了。如果数据真的应该是静态的(我对项目的了解还不够确定),那么一个带有getter的静态成员就是这样做的。我不会称它为god对象——它只是一个模型对象,只是在做它应该做的事情——加载数据并存储它。根据您想要将整个责任封装到单个类中的方法,问题是如何对该责任进行分类。坦率地说,瓦希德正在做的几乎已经是这样了。David,他还说他在他的大多数类中使用这些数据,这将把数据放在全局范围内。但应确保将它们作为私有集的属性处理。@Dracor:
“这将把数据放入全局范围”
-不一定。同样,我们需要更多地了解设计。但仅仅因为两件事