13

我有一个类似于这样的类结构:

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 实现此目的的正确方法,还是有更好的方法?

4

2 回答 2

3

在当前构建中,这可能是唯一的选择(特别是因为基本类型是抽象的)。但是,考虑建议区分继承系统的方法并不是不合理的。这不是我们迄今为止所做的事情,仅仅是因为它还没有出现——但这听起来并非不可能。我能看到的最大问题(显然除了 IL-wrangling)就是我们如何表达这种关系。

于 2013-04-20T07:12:51.100 回答
-1

我想出了这个解决方案:

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;
                });       

听起来很棘手,但它确实有效!

希望它可以帮助你。}

于 2016-09-13T04:31:07.530 回答