Я только что взял проект ASP.NET MVC, и требуется некоторое рефакторинг, но я хотел получить некоторые советы/рекомендации для лучших практик.
У сайта есть сервер SQL Server, и здесь представлен обзор проектов внутри решения:
- DomainObjects (один класс для каждой таблицы базы данных)
- DomainORM (код преобразования из объектов в БД)
- Модели (бизнес-логика)
- MVC (обычная веб-настройка ASP.NET MVC) ---- Контроллеры ---- ViewModels ---- Просмотры ---- Сценарии
Первая "проблема", которую я вижу, заключается в том, что в то время как классы объектов Domain в значительной степени POCO с некоторыми дополнительными свойствами "получить" при вычислении поля, в объектах домена есть код представления. Например, внутри проекта DomainObjects существует объект Person, и я вижу это свойство в этом классе:
public class Person
{
public virtual string NameIdHTML
{
get
{
return "<a href='/People/Detail/" + Id + "'>" + Name + "</a> (" + Id + ")";
}
}
}
поэтому очевидно, что содержимое HTML-содержимого внутри объекта домена кажется неправильным.
Подходы к рефактору:
-
Мой первый инстинкт состоял в том, чтобы переместить это в класс ViewModel внутри проекта MVC, но я вижу, что есть много просмотров, которые попадают в этот код, поэтому я не хочу дублировать код в каждой модели представления.
-
Вторая идея заключалась в создании класса PersonHTML, который был либо:
2а. Обертка, которая взяла в Person в конструкторе или
2b. Класс, унаследованный от Person, а затем имеет все эти методы рендеринга HTML.
Модель представления преобразует любой объект Person в объект PersonHTML и использует его для всего кода рендеринга.
Я просто хотел увидеть:
-
Если здесь есть лучшая практика, так как кажется, что это общая проблема/шаблон, который появляется
-
Насколько плохо это текущее состояние считается, потому что, помимо чувства неправильности, это не вызывает серьезных проблем с пониманием кода или созданием плохих зависимостей. Любые аргументы, которые помогут описать, почему оставить код в этом состоянии плох с реального практического смысла (в сравнении с теоретическим разделением аргументов в отношении проблем), будут полезны, а также есть дискуссия в команде, стоит ли ее менять.