Yeo*_*nho 7 c# database silverlight asynchronous properties
我有一个显示客户信息的窗口.当窗口加载时,我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);
}
Run Code Online (Sandbox Code Playgroud)
高级程序员告诉我,最好把这个逻辑放在CurrentCustomer的get访问器中,因为那时候
将异步数据库调用放在属性的get访问器中是一种好习惯吗?
一般来说,事实并非如此。
通常,如果获取某些东西还涉及做其他昂贵的事情,那么您应该为此目的使用完整的 getter 方法:
public object GetSomething() { }
// accessing code
var value = obj.GetSomething();
Run Code Online (Sandbox Code Playgroud)
这意味着获得某些东西不是免费的......比较:
var value = obj.Something;
Run Code Online (Sandbox Code Playgroud)
这看起来更像是一个正常的值分配,隐藏了幕后发生的危险异步调用,在我看来这是一个坏主意。
但与其他一切一样......它也取决于整个架构中的其他部分。
如果对象的整个目的是使用属性抽象出大量异步调用(例如 Linq2Sql 或实体框架实体的情况),那么这很好,因为您必须意识到您正在处理不(或关闭)的调用。 to) 不受代码上下文的影响。
...
这取决于代码的上下文。如果每当您访问此属性时,您确定会被提醒昂贵的电话,那么我认为这很好。但如果情况并非如此,那么您应该通过将其转变为成熟的方法而不是属性来使其更加明确。