gpt4 book ai didi

c# - 我应该如何为多对多关系设计类?

转载 作者:太空宇宙 更新时间:2023-11-03 14:35:59 25 4
gpt4 key购买 nike

假设我正在为一家制药公司开发软件,其中每个 'ProductionLine' 都有多个 'Stages' 并且每个 Stage 都有多个 'Machines'

现在假设我正在维护三个表来记录阶段及其机器(为了讨论的动​​摇而将 ProductionLine 放在一边)。

(1) Stage(代表任何生产线可能拥有的所有Stages的基础数据)

(2) 机器(代表生产工厂可能拥有的所有机器的基础数据)

(3) StageMachines(表示为一个阶段分配的机器数量)

请注意,一个阶段可以有多个机器,一个机器可以是多个阶段的一部分。但是机器类不应该有阶段列表,因为它与业务问题域无关。

我设计了以下类:

public class Stage
{
private int _stageId;
public int StageID
{
get { return _stageId; }
set { _stageId = value; }
}

private string _stageName;
public string StageName
{
get { return _stageName; }
set { _stageName = value; }
}

private List<Machine> myVar;
public List<Machine> Machines
{
get { return myVar; }
set { myVar = value; }
}

public static bool Save(Stage stage)
{
//save code goes here...
}
}


public class Machine
{
private int _machineId;
public int MachineID
{
get { return _machineId; }
set { _machineId = value; }
}

private string _machineName;
public string MachineName
{
get { return _machineName; }
set { _machineName = value; }
}

public Machine()
{
}

public Machine(int id, string name)
{
_machineId = id;
_machineName = name;
}
}

现在我面临一个困境:

(1) 当我创建一个舞台时,我必须从所有机器中选择一些机器并保存数据。我应该如何在我的代码中处理这个问题,因为我应该能够编写以下代码:

Stage s = new Stage();
s.Machines.Add(new Machine(1, "Machine#1"));
s.Machines.Add(new Machine(2, "Machine#2"));
s.Machines.Add(new Machine(3, "Machine#3"));

Stage.Save(s);

(2) 我应该如何在我的代码中维护这种多对多关系?我应该创建一个名为 'StageMachine' 的第三个类吗?如果我这样做,我应该如何在创建 Stage 对象时保存机器?

谁能给我一个解决方案?

*** 另一个问题是,在检索 Stage 的机器时,我应该如何以及在 nTier 中的何处进行映射?

What is a good design pattern in C# for classes that need to reference other classes?

此链接讨论了类设计问题,但没有回答 NTier 设计中我的 Stage 对象的机器的保存和检索机制。

最佳答案

虽然它与业务问题无关,但实际上机器确实与舞台有关联,最好用集合来表达。如果您使用的是 O/R 映射器,我认为最简单的解决方案是在 Machine 上实现 Stage 集合,但不要公开它。这可能会在以后提供其他优势,例如公开 Count 属性以表示一台机器使用了多少个阶段。我的解决方案是这样的:

public class Stage
{
private List<Machine> _machines = new List<Machine>();

public IEnumerable<Machine>
{
get { return _machines; }
}

public void AddMachine(Machine machine)
{
_machines.Add(machine);
machine.AddStage(this);
}

public void RemoveMachine(Machine machine)
{
_machines.Remove(machine);
machine.RemoveStage(this);
}

// etc.
}

public class Machine
{
private List<Stage> _stages = new List<Stage>();

internal void AddStage(Stage stage)
{
_stages.Add(stage);
}

internal void RemoveStage(Stage stage)
{
_stage.Remove(stage);
}

// etc.
}

关于c# - 我应该如何为多对多关系设计类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1081733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com