我有一个执行资源密集型调用来填充其数据的类。标准的东西。这是一个简化版...
public class Foo1 {
private bool _IsLoaded;
private string _Prop;
private string _Prop2;
public string Prop1 {
get {
ResourceIntensiveCall();
return _Prop1;
}
}
public string Prop2 {
get {
ResourceIntensiveCall();
return _Prop2;
}
}
private void ResourceIntensiveCall() {
if ((!_IsLoaded)) {
// Do processing...
_IsLoaded = true;
}
_Prop1 = "something";
_Prop2 = "stuff";
}
}
这很好用,但违反了 Microsoft.Design 规则 UsePropertiesWhereAppropriate,因为该属性做了太多工作(尽管是间接的)。
我可以将调用移至构造函数,但这违反了在构造函数中做太多工作的规则。
我可以使用函数来代替属性,但是如果你有很多函数,这会感觉很麻烦。无论如何,只有第一个客户调用才能真正发挥作用。
我可以使用客户端代码在访问任何属性之前必须调用的 Public Init() 方法,但这是一个设计禁忌,因为它使类太脆弱。
我考虑使用 Foo1Factory 来新建 Foo1 对象并标记 Foo1 构造函数 Internal 以防止世界绕过我的工厂。
对于这种情况,什么被认为是合适的设计?