主人对他们的奴隶真正了解多少?
What do masters really know about their slaves?
我的设备采用 Master/Slave 配置,我正在开发 WPF/MVVM 应用程序。
我有一个 COM 对象(所有实现 IDevice
)代表外部 device/Modbus 网络的状态并附加到 SerialPort
或 Socket
之类的东西.这意味着,在通过 Version
和 Revision
识别设备后,我调用 IDevice device = DeviceManager.GetDevice(version, revision);
来获取表示出厂默认设备状态的对象。
现在我有了一个 IDevice
,我可以调用它的 API 来获得 List<ushort> GetCoreRegisters()
和 List<ushort> GetAllRegisters()
之类的东西。话虽如此,在读取寄存器值后,我必须调用 IDevice
的 API 来设置值:device.SetItemValue(registerAddress, registerValue)
以便更新设备另一侧的状态网络。
我创建了一个处理通信层的 Master
类型(Socket
与 SerialPort
)。
在我的应用程序的当前状态下,我在我的一个视图模型中调用了类似于以下伪代码的内容(单击按钮后):
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()
我的问题是,这是正确的设计,还是我应该在 Master
中有一个 List<IDevice> Devices
并且在识别设备之后,我会做更像的事情:
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);
所有GetRegister
和SetRegisterValue
逻辑都在Master
里面——意思是Master知道IDevice
的一切,并处理配置状态的逻辑奴隶。
在理想情况下,查看模型代码非常简单。您当然不希望在其中进行 运行 长操作和循环。视图模型包含用于处理来自视图的命令的逻辑,仅此而已。
您的第一个示例似乎包含相当多的领域知识和业务逻辑。这应该在模型中某处。据我所知,您的 Master
class 似乎是放置它的合理位置。
回答名义上的问题:主人对他们的奴隶了解很多,当然足以 "drive" 或 "use" 他们。因此,它知道 IDevice
中的所有内容就可以了。不过要确保它是通用的,主人不应该知道他正在处理的奴隶是什么类型。
我的设备采用 Master/Slave 配置,我正在开发 WPF/MVVM 应用程序。
我有一个 COM 对象(所有实现 IDevice
)代表外部 device/Modbus 网络的状态并附加到 SerialPort
或 Socket
之类的东西.这意味着,在通过 Version
和 Revision
识别设备后,我调用 IDevice device = DeviceManager.GetDevice(version, revision);
来获取表示出厂默认设备状态的对象。
现在我有了一个 IDevice
,我可以调用它的 API 来获得 List<ushort> GetCoreRegisters()
和 List<ushort> GetAllRegisters()
之类的东西。话虽如此,在读取寄存器值后,我必须调用 IDevice
的 API 来设置值:device.SetItemValue(registerAddress, registerValue)
以便更新设备另一侧的状态网络。
我创建了一个处理通信层的 Master
类型(Socket
与 SerialPort
)。
在我的应用程序的当前状态下,我在我的一个视图模型中调用了类似于以下伪代码的内容(单击按钮后):
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()
我的问题是,这是正确的设计,还是我应该在 Master
中有一个 List<IDevice> Devices
并且在识别设备之后,我会做更像的事情:
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);
所有GetRegister
和SetRegisterValue
逻辑都在Master
里面——意思是Master知道IDevice
的一切,并处理配置状态的逻辑奴隶。
在理想情况下,查看模型代码非常简单。您当然不希望在其中进行 运行 长操作和循环。视图模型包含用于处理来自视图的命令的逻辑,仅此而已。
您的第一个示例似乎包含相当多的领域知识和业务逻辑。这应该在模型中某处。据我所知,您的 Master
class 似乎是放置它的合理位置。
回答名义上的问题:主人对他们的奴隶了解很多,当然足以 "drive" 或 "use" 他们。因此,它知道 IDevice
中的所有内容就可以了。不过要确保它是通用的,主人不应该知道他正在处理的奴隶是什么类型。