嘿,我一直在寻找解决我们在代码库中遇到的棘手问题的方法。
首先,我们的代码类似于以下内容:
class User
{
int id;
int accountId;
Account account
{
get { return Account.Get(accountId); }
}
}
class Account
{
int accountId;
OnlinePresence Presence
{
get { return OnlinePresence.Get(accountId); }
}
public static Account Get(int accountId)
{
// hits a database and gets back our object.
}
}
class OnlinePresence
{
int accountId;
bool isOnline;
public static OnlinePresence Get(int accountId)
{
// hits a database and gets back our object.
}
}
我们在代码中经常做的是尝试通过以下方式访问用户的帐户存在
var presence = user.Account.Presence;
问题在于这实际上是向数据库发出两个请求。一个获取 Account 对象,然后一个获取 Presence 对象。如果我们执行以下操作,我们可以轻松地将其归结为一个请求:
var presence = UserPresence.Get(user.id);
这可行,但有点要求开发人员了解 UserPresence 类/方法,这样可以很好地消除。
我已经想到了一些很酷的方法来解决这个问题,并且想知道是否有人知道这些是否可能,是否有其他方法来处理这个问题,或者我们是否需要更多地思考编码并执行 UserPresence.Get 而不是使用属性。
重载嵌套访问器。如果在 User 类中我可以编写某种“扩展”,它会说“任何时候访问 User 对象的 Account 属性的 Presence 对象,就这样做会很酷”。
重载 . 操作员知道接下来会发生什么。如果我能以某种方式使 . 运算符仅在右侧的对象也被“点缀”的情况下会很棒。
这两件事似乎都可以在编译时处理,但也许我遗漏了一些东西(反射会让这变得困难吗?)。我是否完全错误地看待事物?有没有一种方法可以消除业务逻辑用户的负担?
谢谢!蒂姆