我有一个显示客户信息的窗口。
当窗口加载时,我从构造函数中调用LoadCustomer()
方法,该构造函数异步加载来自数据库的客户信息,这将设置CurrentCustomer
属性。
然后更新UI,因为它绑定到CurrentCustomer
。
private void LoadCustomer(Guid customerID)
{
var customerContext = new CustomerContext();
var customerQuery = customerContext.GetCustomersQuery()
.Where(e => e.CustomerID == customerID);
customerContext.Load(customerQuery,
loadOperation =>
{
CurrentCustomer = loadOperation.Entities.SingleOrDefault();
}, null);
}
高级程序员告诉我,最好把这个逻辑放在CurrentCustomer的get访问器中,因为那时
将异步数据库调用放在属性的get访问器中是不错的做法?
答案 0 :(得分:5)
听起来你的高级开发人员错过了代码的异步性质。将代码移动到属性的getter的唯一方法是阻塞调用线程,直到异步操作完成并且有一个值要返回。这将是非常糟糕的财产。
答案 1 :(得分:4)
一般来说,不是。
通常如果得到的东西也会涉及做其他昂贵的事情,你应该为此目的使用一个完整的getter方法:
public object GetSomething() { }
// accessing code
var value = obj.GetSomething();
这表示获得某些东西不是免费的......比较:
var value = obj.Something;
这看起来更像是隐藏在场景后面发生的危险异步调用的正常值赋值,IMO是个坏主意。
但与其他所有内容一样...... 它也取决于整个架构中的其他部分。
如果对象的整个目的是使用属性抽象掉许多异步调用(例如Linq2Sql或Entity Framework实体的情况)那么这很好,因为你必须知道你正在处理不是(或接近)免于代码的上下文。
...
这取决于代码的上下文。如果您在访问此房产时,您确信会被提醒您这个昂贵的电话,那么我认为这很好。但如果情况并非如此,那么你应该通过把它变成一个完整的方法而不是属性来使它更明确。
答案 2 :(得分:1)
他在访问器中延迟加载是正确的 - 因为在创建对象时不会进行异步调用。只有在调用访问者时才会进行。
他也期待不将其留在物业存取器中,而是在别处重构。当访问者已经隔离了呼叫时,重构更容易。
然而,将异步调用留在访问器中并不是一个好主意,但听起来并不像他期望它留在那里。