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