依赖注入取决于数据库值

时间:2018-07-12 19:08:07

标签: c# .net entity-framework reflection serial-port

我正在尝试开发自己为公司编写的应用程序,该应用程序可以处理变送器自动测量,例如校准。

直到现在,用于测量的设备已在应用程序中进行了“硬编码”。即每次测量我们只有一个设备。

现在,应用程序应提供添加/更改/删除测量设备并选择将用于给定测量的设备的选项。应该保存此关系,以便一段时间后能够知道哪个设备用于给定的测量。

我正在寻找实现此目标的模式或最佳实践,而无需付出很多努力。

我考虑过的选项:

我有一个名为MeasuringInstruments的DLL,它带有一些接口,例如ICalibratorIDmm。对于我们拥有的每个设备,我都有一个类,它们根据它们的“能力”实现适当的接口。

这些特定类中的每一个都具有属性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();

但是我并不确定,因为名称的任何更改都会使我的应用崩溃。

我试图寻找需要不费吹灰之力地处理此类事情的示例/开源。因此,我决定在这里询问是否可以接受这种方法,或者还有更好的方法?

0 个答案:

没有答案