Мы с коллегой разработали систему для наших клиентов, и, на наш взгляд, мы создали красивый чистый дизайн. Но у меня проблемы с некоторой связью, которую мы ввели. Я мог бы попытаться создать пример дизайна, который включает те же проблемы, что и наш дизайн, но если вы простите меня, я создам выдержку нашего дизайна, чтобы поддержать этот вопрос.
Мы разрабатываем систему регистрации некоторых видов лечения для пациентов. Чтобы не иметь сломанной ссылки на изображение, я опишу концептуальную диаграмму классов UML как определение класса стиля С#.
class Discipline {}
class ProtocolKind
{
Discipline;
}
class Protocol
{
ProtocolKind;
ProtocolMedication; //1..*
}
class ProtocolMedication
{
Medicine;
}
class Medicine
{
AdministrationRoute;
}
class AdministrationRoute {}
Я попытаюсь немного объяснить дизайн, протокол - это шаблон для нового лечения. И протокол имеет определенный вид и имеет лекарства, которые нужно вводить. По протоколу дозировка может отличаться для одного и того же медикамента (среди прочего), так что хранится в классе ProtocolMedication. AdministrationRoute - это способ, которым лекарство администрируется и которое создается/обновляется отдельно от управления протоколом.
Я нашел следующие места, в которых у нас будет нарушение Закона Деметры:
Нарушения закона Деметры
Внутри BLL
Например, внутри бизнес-логики ProtocolMedication существуют правила, которые зависят от свойства AdministrationRoute.Soluble лекарства. Код станет
if (!Medicine.AdministrationRoute.Soluble)
{
//validate constrains on fields
}
Внутри репозиториев
Метод, который будет перечислять все протоколы в определенной Дисциплине, будет записан как:
public IQueryable<Protocol> ListQueryable(Discipline discipline)
{
return ListQueryable().Where(p => (p.Kind.Discipline.Id == discipline.Id)); // Entity Frameworks needs you to compare the Id...
}
Внутри пользовательского интерфейса
Мы используем ASP.NET(без MVC) для интерфейса нашей системы, на мой взгляд, этот слой в настоящее время имеет самые серьезные нарушения. Конфигурация привязки gridview (столбец, который должен отображать Дисциплину протокола, должен связываться с Kind.Discipline.Name), которые являются строками, , поэтому ошибки времени компиляции.
<asp:TemplateField HeaderText="Discipline" SortExpression="Kind.Discipline.Name">
<ItemTemplate>
<%# Eval("Kind.Discipline.Name")%>
</ItemTemplate>
</asp:TemplateField>
Итак, я думаю, что реальный вопрос может быть, когда было бы лучше смотреть на него скорее как предложение Деметры, и что можно сделать, чтобы разрешить нарушения Закона Деметры?
У меня есть несколько идей о себе, но я отправлю их в качестве ответов, чтобы их можно было прокомментировать и проголосовать отдельно. (Я не уверен, что это SO способ сделать это, если нет, я удалю свои ответы и добавлю их к вопросу).