从Dapper 1.50.5开始,添加了这个功能,允许Dapper设置readonly属性(getter,no setter):
这很好,因为我希望除了构造函数之外的任何东西都不会修改。 (所以我不想要制定者)
现在我有一种情况,我想通过在构造函数中指定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; };
}
答案 0 :(得分:1)
您可以标记构造函数internal
而不是public
。然后将对象移动到自己的程序集/ DLL,因此程序的其余部分根本无法构造它们。现在InternalsVisibleTo
属性可以让Dapper访问它以查看它所需的构造函数。
结合工厂模式来公开将对象构建到程序其余部分的安全方法,可能会实现您正在寻找的目标。