我正在编写 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/