Как скрыть нижние ярусы от верхних, но сделать так, чтобы они могли передавать данные? - PullRequest
0 голосов
/ 30 сентября 2019

Я делаю домашний проект на C #. Мой проект включает в себя EF. Он имеет базу данных, автоматически сгенерированную библиотеку классов сущностей EF со всеми классами моделей в ней, уровень репозитория и уровень представления. Я хочу, чтобы уровень представления не зависел от уровня данных. Я подумал, что создал еще один уровень, который содержит интерфейсы сущностей, поэтому на верхних уровнях я мог ссылаться только на уровень интерфейса и по-прежнему иметь возможность передавать данные без случайного изменения данных или зависимости от данных. Однако это не работает, потому что класс генератора модели выдает исключение, что свойства не отображаются. Я сейчас в замешательстве. Как я мог этого добиться? Есть ли шаблон дизайна, который я должен рассмотреть?

Спасибо.

1 Ответ

0 голосов
/ 30 сентября 2019

Классы сущностей генерируются как частичные классы, чтобы вы могли расширять эти классы с помощью других членов, таких как методы, поля и т. Д. Я бы добавил еще один частичный класс в проект репозитория, который реализует желаемый интерфейс. Этот интерфейс будет определен в вашем интерфейсе проекта. Таким образом, вы можете вернуть интерфейс из репозитория вместо определенного класса.

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

    public partial class EntityClass
    {
        public int MyProperty { get; set; }

        public string String { get; set; }

        public bool Boolean { get; set; }
    }

Затем в том же проекте вы определяете частичный класс с тем же именем,Не забудьте оставить здесь то же самое пространство имен, что и для исходной автоматически сгенерированной модели!

    public partial class EntityClass : IEntityClass
    {
        public int AnotherOne { get; set; }
    }

И в своем проекте интерфейса вы можете добавить что-то вроде этого

    public interface IEntityClass
    {
        int MyProperty { get; set; }

        string String { get; set; }

        bool Boolean { get; set; }

        int AnotherOne { get; set; }
    }

Помните, что этоочень громоздкий подход, потому что вы должны помнить, чтобы обновлять интерфейс всякий раз, когда вы меняете модель данных. Другой способ, который обычно используется, - определение DTO (объекта передачи данных).

Здесь кто-то задал похожий вопрос. Пожалуйста, прочитайте это.

...