大师们真正了解他们的奴隶是什么?

时间:2015-02-24 20:58:24

标签: c# communication network-protocols

我的设备处于主/从配置,我正在开发WPF / MVVM应用程序。

我有一个COM对象(所有这些都实现IDevice),它们代表外部设备/ Modbus网络的状态,并附加到SerialPortSocket之类。这意味着,在通过VersionRevision识别设备后,我调用IDevice device = DeviceManager.GetDevice(version, revision);来获取表示出厂默认设备状态的对象。

既然我有IDevice,我可以调用其API来获取List<ushort> GetCoreRegisters()List<ushort> GetAllRegisters()之类的内容。话虽如此,在读取寄存器值后,我必须调用IDevice的API来设置值:device.SetItemValue(registerAddress, registerValue),以便更新网络另一端的设备状态。 / p>

我创建了Master类型,用于处理通信层(SocketSerialPort)。

在我的应用程序的当前状态中,我在我的一个视图模型中调用类似下面的伪代码(在单击按钮之后):

IDevice device = null;
profile = SelectedProfile
master = MasterFactory.GetMaster(profile.Name)
master.Open() //Connects or Opens SerialPort/Socket
if(master.DeviceCheck(profile.SlaveAddress))
{
    KeyValuePair<ushort, ushort> info = await master.IdentifyDeviceAsync(profile.SlaveAddress);
    device = DeviceManager.GetDevice(info.Key, info.Value)
    initList = device.GetInitializationRegisters()
    initValues = await master.ReadRegisters(profile.SlaveAddress, initList)
    for(int i = 0; i < initList; i++)
        device.SetRegisterValue(initList[i], initValues[i]);

    allRegisters = device.GetAllRegisters();
    allValues = await master.ReadRegisters(profileSlaveAddress, allRegisters)
    for ... repeat
}
if device != null, DevicesInViewModel.Add(device)
master.Close()

我的问题是,这是正确的设计,还是我应该在List<IDevice> DevicesMaster,在识别设备后,我会做更多的事情:

device = DeviceManager.GetDevice(info.Key, info.Value);
master.Add(device);
// possibly add more devices if needed
List<IDevice> devices = master.ReadDevices()
if devices != null, DevicesInViewModel.AddRange(devices);

所有GetRegisterSetRegisterValue逻辑都位于Master内 - 意味着Master了解IDevice的所有内容并处理配置从属状态的逻辑。

1 个答案:

答案 0 :(得分:1)

在理想的世界中查看模型代码非常简单。你当然不希望在其中运行长时间的操作和循环。视图模型包含用于处理来自视图的命令的逻辑。

您的第一个示例似乎有相当多的领域知识和业务逻辑。这应该在模型中某处。从我所看到的,你的Master课程似乎是一个合理的地方。

回答这个名义上的问题:大师们对他们的奴隶有很多了解,当然足以让他们开车#34;或&#34;使用&#34;他们。因此,它知道IDevice中的所有内容都可以。确保它是通用的,主人不应该知道他正在处理的奴隶的类型