我有类似的类结构:
public abstract class Device
{
public int DeviceId { get; set; }
//Additional Properties
}
public class DeviceA : Device
{
//Specific Behaviour
}
public class DeviceB : Device
{
//Specific Behaviour
}
我需要检索设备列表,或者单个设备,它被实例化为适当的派生类型(基于数据库中设备记录中的类型值)。也就是说,Device
对象的集合应包含许多具有不同类型的对象,所有这些对象都派生自Device
。
我已经通过以下方式实现了这一点,但有些事情对此感觉不对。
public static IEnumerable<Device> AllDevices()
{
using (var connection = CreateConnection())
{
connection.Open();
return connection.Query<dynamic>("SELECT * FROM Device").Select<dynamic, Device>(d =>
{
Device device = null;
if (d.DeviceTypeID == 1)
device = new DeviceA();
else if (d.DeviceTypeID == 2)
device = new DeviceB();
else throw new Exception("Unknown Device");
device.DeviceId = d.DeviceID;
return device;
});
}
}
这是使用Dapper实现此目的的正确方法,还是有更好的方法?
答案 0 :(得分:3)
在当前构建中可能是唯一的选项(特别是因为base-type是抽象的)。但是,考虑建议有区别的继承制度是不合理的。到目前为止,我们所做的并不是因为它没有出现 - 但这听起来并非不可能。我能看到的最大问题(显然除了IL争论之外)就是我们如何表达这种关系。
答案 1 :(得分:0)
我想出了这个解决方案:
using (IDbConnection db = new MySqlConnection(ConfigurationManager.ConnectionStrings["yourConnection"].ConnectionString))
{
return db.Query<dynamic, DeviceA, DeviceB, Device>(@"
Select
Discriminator,
...
From Device", (d, da, db) =>
{
if (p.Discriminator == "DeviceA")
{
return new DeviceA();
}
else if (p.Discriminator == "DeviceB")
{
return new DeviceB();
}
return d;
});
听起来很棘手,但确实有效!
希望它可以帮到你。 }