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