在代码审查期间,我查看了一组存储库类(在vb.net中)。我习惯于看到这些存储库类充满了返回域对象集合(以及其他内容)的函数。但是,此存储库有1个公共属性和1个私有变量,如下所示:
Private _item as Collection (of Customer)
Public Item as Collection (of Customer)
Get...
Set...
在“获取”中,有一些代码从DAL获取客户并将其加载到私有_item中。
使用属性(customerRepository.Item)而不是普通旧函数(customerRepository.GetAllCustomers)会带来什么好处? “财产”方式对我来说很奇怪,但奇怪并不总是意味着错误。
答案 0 :(得分:3)
我同意在访问任何类型的DAL的setter中进行操作是不好的做法。
根据MSDN Property Usage Guidelines,必须在以下情况下使用方法:
- 操作非常昂贵,您希望与用户沟通,他们应该考虑缓存结果。
- 使用get访问器获取属性值会产生可观察到的副作用。
很明显,使用上述属性违反了该指南。
答案 1 :(得分:2)
在此示例中,getter返回整个集合,并允许用户从中获取项目。在存储库模式中,存储库是集合,您使用集合语义与它进行交互,以获取存储库应该持有的实体的特定实例。
此实现的危险在于此API的用户可以使用其他集合替换集合。在我看来,这是不好的做法
答案 2 :(得分:0)
如果你的意思是在Get(而不是Setter)中“有代码从DAL获取客户并将其加载到私有_item”,那么我已经看到代码已经完成,但是有检查私有_item是否为null。然后它变成一个缓存,它只在第一次访问时从DAL中读取。每隔一次直接从私有_item返回。
当然,您也可以在GetAllCustomers中执行缓存方案。