【发布时间】:2010-04-15 17:59:00
【问题描述】:
嘿,我一直在寻找解决我们在代码库中遇到的棘手问题的方法。
首先,我们的代码如下所示:
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 对象,都可以这样做”。
重载 .操作员知道接下来会发生什么。 如果我能以某种方式使 .运算符仅在右侧的对象也被“点缀”的情况下会很棒。
这两个似乎都可以在编译时处理,但也许我遗漏了一些东西(反射会使这变得困难吗?)。我是否完全错误地看待事物?有没有一种方法可以消除业务逻辑用户的负担?
谢谢! 蒂姆
【问题讨论】:
标签: c# properties operator-overloading accessor