2015-02-24 2 views
4

У меня есть мои устройства в конфигурации Master/Slave, и я разрабатываю приложение WPF/MVVM.Что действительно знают мастера о своих рабах?

У меня есть COM-объекты (все которые реализуют IDevice), которые представляют состояние внешнего устройства/сети Modbus и прикрепленные к чему-то, как SerialPort или Socket. Это означает, что после идентификации устройства по его Version и Revision я вызываю IDevice device = DeviceManager.GetDevice(version, revision);, чтобы получить объект, который представляет состояние фабричного устройства по умолчанию.

Теперь, когда у меня есть IDevice, я могу назвать его API, чтобы получить такие вещи, как List<ushort> GetCoreRegisters() и List<ushort> GetAllRegisters(). С учетом сказанного, после считывания значений регистра, я должен вызвать API IDevice для установки значений: 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() 

Мой вопрос, правильно ли это дизайн, или я должен иметь List<IDevice> Devices в Master и после идентификации устройства (устройств), я хотел бы сделать что-то подобное:

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 -meaning Master знает все о IDevice и обрабатывает логику настройки состояния подчиненных устройств.

ответ

1

Показать код модели, в идеальном мире, довольно просто. Вы, конечно, не хотите, чтобы выполнялись длительные операции и циклы. Модель просмотра содержит логику обработки команд из представления, вот и все.

Ваш первый пример, похоже, имеет довольно много знаний о домене и бизнес-логики. Это должно пойти где-то в модели. Из того, что я вижу, ваш класс Master кажется разумным местом для его размещения.

Чтобы ответить на титульный вопрос: Мастера знают о своих рабах совсем немного, конечно, достаточно, чтобы «водить» или «использовать» их. Таким образом, он знает обо всем в IDevice в порядке. Удостоверьтесь, что его общий, однако, мастер не должен знать какой тип раба, с которым он имеет дело.

Смежные вопросы