我正在开发我的第一个.NET项目(.NET 3.5,ADO.NET和C#)。我们已经构建了我们的实体模型,并试图构建一个干净的业务对象层。将业务层添加到ADO .NET Entity Framework
我们已经有了我们的基本实体模型,我们希望将某些业务级语义添加到默认数据访问器(导航属性等)。
例如,假设我们在Person
和BankAccounts
之间存在多对多关系。我们假设在业务层,我们希望添加冻结帐户的功能。现在,我们希望从一个人转到能力:
- 所有的银行账户,
- 其非冻结银行账户,并
- 其冻结的银行账户。
当然,我们希望使名义大小写成为默认值:如果我浏览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这似乎暗示有没有在一个清晰的关注分离添加的好方法。
好的方法,但是,它也可以用EF4来实现。 – 2011-04-11 20:53:54