我有一些自定义类,如BarcodeDevice
和LightDevice
,它们是从一个名为Device
的基类派生而来的。
1.将所有定制类保存到一个表中,即Device
表。
1.根据类(设备)的功能,每个自定义类可能包含不同的属性。
1.有些自定义类已经和项目一起加载了,而其他的将在以后创建并以某种方式加载,例如通过上传Dll
文件。因此,一旦项目上线,代码就不能更改。
1.可以通过使用DbContext
从数据库加载Device
对象来检索各个定制类。
我现在使用的是Discriminator
,它可以工作,但是它只运行一次,因此不支持在运行时添加自定义类。我该如何解决这个问题?DbContext
:
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<Device> Devices { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Configure device type for each type.
modelBuilder.Entity<BarcodeDevice>()
.HasDiscriminator(p => p.Type)
.HasValue(nameof(BarcodeDevice));
modelBuilder.Entity<LightDevice>()
.HasDiscriminator(p => p.Type)
.HasValue(nameof(LightDevice));
}
}
自定义类:
public class BarcodeDevice : Device
{
[Required]
public string Type { get; set; }
private SerialPort serial { get; set; }
private string barcodeValue { get; set;}
// other properties
}
服务:
public class DeviceService : IDeviceService
{
// Some variables
public DeviceService(IServiceScopeFactory serviceScopeFactory)
{
_serviceScopeFactory = serviceScopeFactory;
var dbContext = _serviceScopeFactory.CreateScope()
.ServiceProvider.GetRequiredService<ApplicationDbContext>();
Devices = dbContext.Devices.ToList();
for (int i = 0; i < Devices.Count; i++)
{
Devices[i].StartInstance();
Devices[i].OnMessageSend += Device_OnMessageSend;
}
_mqttClient = _serviceScopeFactory.CreateScope()
.ServiceProvider.GetRequiredService<IResolverMqttClient>();
_mqttClient.OnMqttMessageReceived += MqttClient_OnMqttMessageReceived;
}
// some methods
}
1条答案
按热度按时间llycmphe1#
你的选择。
1.回到3)。你真的需要这个吗?
1.别用EF,
或
1.只Map了一个JSON列来存储每种设备类型的不同属性。