Я имею дело с базой данных, которая содержит данные с несогласованностью, например, белым передним и задним пробелом.Должен ли метод Trim на уровне доступа к данным или с уровнем домена?
В целом, я вижу, что многие разработчики практикуют защитное кодирование, обрезая почти все строки, которые поступают из базы данных, которые могут быть введены пользователем в какой-то момент. В моем oppinoin лучше сделать такое форматирование до того, как данные будут сохранены, так что это будет сделано только один раз, а затем данные могут быть в стабильном и надежном состоянии. К сожалению, это не тот случай, который приводит меня к следующему лучшему решению, используя метод Trim.
Если я обрезаю все данные как часть уровня доступа к данным, то мне не нужно заниматься защитой в бизнес-объектах моего домена. Если я вместо этого поставил ответственность за обрезку в своих бизнес-объектах, например, с помощью набора элементов доступа к своим свойствам C#, я должен получить одинаковые результаты в сети, однако обрезка будет работать со всеми значениями, назначенными для свойств моих бизнес-объектов, а не только из тех, которые приходят из несогласованной базы данных.
Я думаю, как несколько philisophical вопрос, который может определить, ответ, который я мог бы спросить «Если слой домена несет ответственность за оборонительное/коэрцитивное форматирование данных?» Имеет ли смысл иметь набор аксессор для свойства PhoneNumber на бизнес-объекте принять неформатированную или отформатированную строку, а затем попытаться отформатировать ее по мере необходимости или должна ли эта ответственность быть перенесена на уровни представления и доступа к данным, оставив уровень домена более строгим в том типе данных, который он примет? Я думаю, что это может быть более фундаментальный вопрос.
Обновление: Ниже приведены несколько ссылок, которые, как я думал, должны делиться этой темой.
Information service patterns, Part 3: Data cleansing pattern
LINQ to SQL - Format a string before saving?
How to trim values using Linq to Sql?
Мое мышление идет по тем же линиям. Я предполагаю, что я понял, что, поставив код форматирования в модели домена, я мог бы по существу позаботиться о двух проблемах форматирования, один из которых является данными, которые поступают из пользовательского интерфейса, и вторыми данными, поступающими из базы данных. Это по существу похоже на метод самовосстановления, который вы описали, но не требуя этого в пользовательском интерфейсе. Но так часто бывает так, потому что что-то имеет смысл по одной причине, это не значит, что это правильный выбор. – jpierson
Следует также упомянуть, что я использую LINQ to SQL, поэтому в моем случае было бы довольно тривиально размещать некоторый код на уровне доступа к данным, который запускает Trim() любое значение, о котором идет речь, и самое лучшее, что это позволило бы форматирование данных, поскольку оно сохраняется и как оно извлекается из базы данных. Очевидно, что в долгосрочной перспективе все обойдется, но на данный момент, поскольку мне приходится жить с плохо fomratted данными, я думаю, что это разумное решение. В качестве альтернативы так же легко разместить код в моих бизнес-объектах. Какая из них правильнее? Существуют ли другие подходящие альтернативы? – jpierson
Как я попытался объяснить в своем ответе: обрезка - это не проблема области приложения, а скорее самого приложения (того, что обслуживает домен). Так что не обрезайте объекты Domain/Business. Обрежьте слой Application/Service или, если вам действительно, слой UI. Но опять же, пользовательский интерфейс предназначен для презентации, и, хотя эта ответственность может показаться подходящей, это не так. Если у вас нет уровня приложения или службы, тогда пользовательский интерфейс должен быть тем местом, которое я думаю. –