readonly POCO始终代表数据库状态

时间:2018-06-16 15:51:05

标签: c# dapper poco

从Dapper 1.50.5开始,添加了这个功能,允许Dapper设置readonly属性(getter,no setter):

  

Does Dapper support c# 6 read-only properties in POCOs?

这很好,因为我希望除了构造函数之外的任何东西都不会修改。 (所以我不想要制定者)

现在我有一种情况,我想通过在构造函数中指定id来创建对象,然后Dapper填充属性。但是,Dapper仍然需要一个无参数构造函数,或者指定每个属性的构造函数。

我不想公开一个构造函数,它有可能使一个对象不是数据库中的精确表示(一个具有未初始化属性的对象,或一个给出错误信息的对象)。

因为Dapper不允许这样做,所以我必须有更好的方法来实现我想要完成的任务。我也觉得代码不太正确。我希望POCO始终代表状态(假设db自创建以来没有变化)并且不可能修改或使其不代表数据库状态。我怎么能做到这一点?

注意:我理解,因为我想要的是Dapper规避我的所有约束,有人可以使用dapper并创建一个FooBar,这是对数据库的误解,但这是一个可接受的实例。

这是psuedo-code我想要的(但不起作用)

public class FooBar
{
    public FooBar(int id) {
        var sql = ""select * from FooBar where id = @id";
        var obj = connection.QuerySingle<FooBar>(sql, new {id});
        this.Id = obj.Id;
        this.Name = obj.Name;
    }

    public int Id { get; }
    public string Name { get; };
}

1 个答案:

答案 0 :(得分:1)

您可以标记构造函数internal而不是public。然后将对象移动到自己的程序集/ DLL,因此程序的其余部分根本无法构造它们。现在InternalsVisibleTo属性可以让Dapper访问它以查看它所需的构造函数。

结合工厂模式来公开将对象构建到程序其余部分的安全方法,可能会实现您正在寻找的目标。