我正在处理一个数据库,其中包含不一致的数据,例如白色前导和尾随空格。
一般来说,我看到许多开发人员通过修剪几乎所有来自数据库的字符串来练习防御性编码,这些字符串可能在某个时候由用户输入。在我的oppinoin 中,最好在数据持久化之前进行这种格式化,这样它只完成一次,然后数据可以处于一致和可靠的状态。不幸的是,情况并非如此,但这导致我使用Trim方法找到下一个最佳解决方案。
如果我修剪所有数据作为我的数据访问层的一部分,那么我不必担心我的领域层的业务对象内的防御性修剪。如果我改为将修剪责任放在我的业务对象中,例如使用我的 C# 属性的 set 访问器,我应该得到相同的净结果,但是修剪将在分配给我的业务对象属性的所有值上运行,而不仅仅是那些来的来自不一致的数据库。
我想这是一个有点哲学的问题,它可能决定我可以问的答案“域层是否应该负责数据的防御/强制格式化? ” 让业务对象上的 PhoneNumber 属性的 set 访问器接受一个未格式化或格式化的字符串,然后尝试根据需要对其进行格式化,还是应该将此责任推给表示层和数据访问层,从而使域层对它将接受的数据类型更加严格?我认为这可能是更根本的问题。
更新:下面是一些我认为我应该分享的关于该主题的链接。