Рассмотрим следующий класс бизнес-объектов. Чтобы проверить себя, ему нужно что-то знать о состоянии базы данных, возможно, чтобы предотвратить какой-либо конфликт. Таким образом, он зависит от уровня доступа к данным для получения этих данных.
Является ли нарушением принципа единой ответственности наличие класса, который инкапсулирует состояние, проверяет состояние и обращается для этого к хранилищу данных?
class MyBusinessObject
{
private readonly IDataStore DataStore;
public MyBusinessObject(IDataStore dataStore)
{
this.DataStore = dataStore;
}
public virtual int? Id { get; protected set; }
public virtual string Name { get; set; }
// ... Other properties...
public IEnumerable<ValidationResult> Validate()
{
var data = this.DataStore.GetDataThatInfluencesValidation();
return this.ValidateUsing(data);
}
// ... ValidateUsing method would be in here somewhere ...
}
Для меня это красный флаг, потому что:
- В контексте метода Create контроллера ASP.NET MVC я мог бы создать новый экземпляр и передать его моему методу View () без намерения проверки, так почему я должен передавать IDataStore?
- Я использую NHibernate (и я новичок), и похоже, что мне нужно создать IInterceptor, который вводит зависимости всякий раз, когда NH создает объекты. Может быть, это будет хорошо, но мне это кажется немного неправильным.
Я начинаю думать, что должен использовать объект типа anemic / DTO для NHibernate и обернуть его во что-то еще, которое знает все бизнес-правила И может получить доступ к хранилищу данных, если это зависит от одного. Теперь, когда я ввел свой вопрос и название, StackOverflow предложил несколько интересных ресурсов: здесь и здесь.
Мой вопрос также очень похож на этот, но я думал, что спрошу иначе, что более точно соответствует моей ситуации.