C# Как правильно организовать код, с преобразованием моделей?

Здравствуйте, имеется модель материала Article:
public partial class Article{
        public DBArticle(): base()
        {
            this.Category = 0;
            this.AuthorID = 0;
            this.AuthorPseudo = 0;
            this.YandexGenre = 1;
            this.GoogleGenre = 1;
            this.MaterialType = 1;
            this.ArticleThemeID = 0;
            this.ShowImage = true;
            this.Featured = false;
            this.Hits = 0;
            this.ArticleStyle = 0;
        }
    
        public int ID { get; set; }
        public string Title { get; set; }
        public string Alias { get; set; }
        public string Lead { get; set; }
        public string Content { get; set; }
        public short State { get; set; }
        public string Image { get; set; }
        public int Category { get; set; }
        public string MetaTitle { get; set; }
        public string MetaDescription { get; set; }
        public string MetaKey { get; set; }
        public string Robots { get; set; }
        public System.DateTime Created { get; set; }
        public int AuthorID { get; set; }
        public int AuthorPseudo { get; set; }
        public short YandexGenre { get; set; }
        public short GoogleGenre { get; set; }
        public short MaterialType { get; set; }
        public int ArticleThemeID { get; set; }
        public bool ShowImage { get; set; }
        public bool Featured { get; set; }
        public int Hits { get; set; }
        public short ArticleStyle { get; set; }
    }


Для редактирования в админке данного материала я создал дополнительную модель FrontEndArticle
public partial class EditorArticle:Article{
        public ArticleModel(Article doc)
        {
            var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Article, ArticleModel>()).CreateMapper();
            mapper.Map(doc,this);
        }
        public List<SelectListItem> Categories { get; set; }
        public List<SelectListItem> Authors { get; set; }
        public List<SelectListItem> AuthorsPseudo { get; set; }
        public List<Tag> Tags { get; set; }
        public List<ArticleTheme> ArticleThemes { get; set; }
        public List<GalleryWithRows> Galleries { get; set; }
    }


Тут списки:
Categories: категорий
Authors: авторов
AuthorsPseudo : псевдонимов авторов
Tags : тегов
ArticleThemes : тем материалов
Galleries: галлерей

Соответственно для формирования такой модели у меня есть отдельная функция в мусоросборочном классе(так как я не совсем уверен куда это правильно поместить) которая в свою очередь и добывает/формирует все эти списки.

Так же есть еще модель на отображения на самом сайте.

Все это мне не нравится и пока не поздно я хочу это правильно организовать, что бы в будущем было проще поддерживать.

Пожалуйста подскажите как вы организовываете подобное в своем коде и как это сделать правильно? Где должны быть функции для получения такой расширенной модели? Нужна ли вообще такая модель? Как избавиться от одного класса хелпера со всеми подряд функциями(от формирования подобных моделей до формирования строк md5,сохранения файлов и т.д.).

Заранее спасибо)
  • Вопрос задан
  • 707 просмотров
Решения вопроса 1
Модели предпочитаю делить на доменные(то, что мапится к БД) и модели представления(то, что нужно отдать клиенту). Реляционная модель данных в большинстве случаев не кореллирует с моделью представления(в вашем случае, например, списки категорий и пр.)

Наследование же представления от домена, на мой взгляд, абсолютно имеет место быть для систем без сложной бизнес-логики (там, где просто CRUD - можно вообще без моделей представления обойтись); в ином случае можно закончить тем, что будет несколько уровней наследования в погоне за требуемым классом. И каждое изменение такого класса(особенно, если он родительский) может стать головной болью.

Обычно, использую такую декомпозицию слоев приложения:
View -> Controller <-Service <- Repository <- Database

Уровень Repository оперирует доменом, уровень Service оперирует как доменом, так и представлением, уровень Controller - только представлением. Соответсвенно, в уровне сервисов и производится преобразование домена в представление.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы