【发布时间】:2009-01-11 14:39:49
【问题描述】:
我正在开发我的第一个 .NET 项目(.NET 3.5、ADO.NET 和 C#)。我们已经构建了实体模型,并正在尝试构建一个干净的业务对象层。
我们已经有了我们的基本实体模型,我们希望将某些业务级语义添加到默认数据访问器(导航属性等)。
例如,假设我们在Person 和BankAccounts 之间存在多对多关系。假设我们想在业务层添加冻结帐户的功能。我们现在希望能够从 Person 导航到:
- 他们所有的银行账户,
- 他们未冻结的银行账户,以及
- 他们被冻结的银行账户。
当然,我们希望将名义情况设为默认值:如果我导航 Person.BankAccounts(),我希望它返回他们未冻结的帐户。我可以添加导航属性Person.FrozenBankAccounts() 和Person.AllBankAccounts()。
我们提出的两种方法似乎都有相当多的代码味道。
- 我们找不到覆盖实体模型方法的方法。所以,留下
Person.BankAccounts()作为返回所有银行账户的访问者。然后我们添加一个Person.FrozenBankAccounts()和一个Person.NonFrozenBankAccounts()。 - 在代码库中添加另一个显式层,用于封装对
BankAccounts的所有访问。
对于方法 1,问题在于名义业务案例(访问未冻结的银行账户)是该批次中最不直观的方法名称。
使用方法 2,当我们从实体模型层子类化对象时,我们必须重写每个方法以确保它不会从底层返回对象。所以我们创建了一个BL_Person,它有一个BankAccounts() 方法,它返回一个BL_BankAccount 对象的集合。但在这种情况下,所有这些代码都显得有点傻。
有没有比我们考虑过的两种方法更好的方法?如果没有更好的方法,我概述的两种方法中的哪一种似乎是更好的解决方案(鉴于我们需要处理 50 多个类)?
注意:在进行网络搜索时,我确实找到了一封致微软的公开信,标题为ADO .NET Entity Framework Vote of No Confidence,这似乎暗示着没有一个好的方法来明确分离关注点.
【问题讨论】:
标签: .net entity-framework .net-3.5 orm ado.net-entity-data-model