我正在尝试开发自己为公司编写的应用程序,该应用程序可以处理变送器自动测量,例如校准。
直到现在,用于测量的设备已在应用程序中进行了“硬编码”。即每次测量我们只有一个设备。
现在,应用程序应提供添加/更改/删除测量设备并选择将用于给定测量的设备的选项。应该保存此关系,以便一段时间后能够知道哪个设备用于给定的测量。
我正在寻找实现此目标的模式或最佳实践,而无需付出很多努力。
我考虑过的选项:
我有一个名为MeasuringInstruments
的DLL,它带有一些接口,例如ICalibrator
和IDmm
。对于我们拥有的每个设备,我都有一个类,它们根据它们的“能力”实现适当的接口。
这些特定类中的每一个都具有属性DeviceName
,该属性公开了设备的模型。
为持久起见,我使用EF6。我的想法是创建一个名为MeasureDevices
的表,例如
public class MeasureDevice : IEntity<int>
{
protected MeasureDevice() { } //Needed for EF
public MeasureDevice(bool isActive, string name, DateTime calibrationDate)
{
IsActive = isActive;
Name = string.IsNullOrEmpty(name) ? throw new ArgumentNullException(nameof(name)) : name;
CalibrationDate = calibrationDate == default(DateTime) ? throw new ArgumentException(nameof(calibrationDate)) : calibrationDate;
}
public int Id { get; protected set; }
public bool IsActive { get; set; }
public string Name { get; protected set; }
public DateTime CalibrationDate { get; protected set; }
public string Company { get; protectedset; }
public int CategoryId { get; protected set; }
public virtual ProductCategory Category { get; protected set; }
public void SetCalibrationDate(DateTime date)
{
if (date == default(DateTime) || date < CalibrationDate || date > DateTime.Now)
throw new ArgumentException();
CalibrationDate = date;
}
public void ChangeName([NotNull] string name)
{
if (string.IsNullOrEmpty(name) || string.IsNullOrWhiteSpace(name)) throw new ArgumentNullException(nameof(name));
Name = name;
}
}
每个度量实体将与此表相关。
对于每台设备,项目Name
被保存在数据库中,其属性{strong>完全与该设备在MeasuringInstruments
中的类名相同。< / p>
我可以通过检查哪些类在MeasuringInstruments
中实现给定接口并创建具有正确值的MeasureDevice
来自动执行此操作。
这样,我可以在运行时通过反射实例化设备的正确“控制器”类,而无需为所有设备编写检查,例如if(deviceName=="xxxx") DeviceController = new XXXX();
但是我并不确定,因为名称的任何更改都会使我的应用崩溃。
我试图寻找需要不费吹灰之力地处理此类事情的示例/开源。因此,我决定在这里询问是否可以接受这种方法,或者还有更好的方法?