Entity Framework и модульность
От: Artem Korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 17.07.17 17:57
Оценка:
День добрый, коллеги.

Есть у меня проект, в котором база данных в некотором смысле "модульная" — некоторые таблицы запросто могут отсутствовать в базе. Их наличие зависит от того, купил ли пользователь соответствующие модули или нет.
На данный момент в проекте используется одновременно несколько подходов работы с данными — и прямые SQL-запросы и Linq2Sql. Я работаю над тем чтобы заменить всё это на Entity Framework. И вот эти "модульные" куски DB схемы меня слегка озадачили. Как с ними работать по-человечески? Есть какие-нибудь проверенные временем подходы?
Мне пока на ум приходит три варианта:

1. Генерируем маппинги для Entity Framework с учётом всех возможных таблиц, в рантайме тщательно следим, чтобы не было обращений к несуществующим таблицам — перед обращением к таблицам из каждого "модуля", проверяем, включен ли этот модуль у клиента. Вроде как должно работать, но потенциально могут всплыть баги там, где забыли сделать проверку. Особенно это чревато в тех местах, где обращение идёт не явно, а через референсы у объектов.

2. Генерируем отдельно маппинги для основной структуры БД и отдельно для каждого модуля. Обращаемся к "модульным" данным в явном виде, через загрузку соответствующего контекста. Этот вариант выглядит разумным, когда количество модулей небольшое — для 3..5 модулей должно быть нормально. Для 30..50, боюсь, получится спагетти-код.

3. Хранимые процедуры. В этом варианте прячем все различия за интерфейсом хранимой процедуры. В этом подходе всё вроде как нормально, за исключением того что хотелось бы иметь всю бизнес-логику на стороне C#.

Что посоветует вселенский разум?
С уважением, Artem Korneev.
Re: Entity Framework и модульность
От: BlackEric http://black-eric.lj.ru
Дата: 17.07.17 20:41
Оценка:
Здравствуйте, Artem Korneev, Вы писали:

AK>2. Генерируем отдельно маппинги для основной структуры БД и отдельно для каждого модуля. Обращаемся к "модульным" данным в явном виде, через загрузку соответствующего контекста. Этот вариант выглядит разумным, когда количество модулей небольшое — для 3..5 модулей должно быть нормально. Для 30..50, боюсь, получится спагетти-код.


Один модуль — одна сборка .Net И не поставлять клиенту сборки которые он не купил.
https://github.com/BlackEric001
Re[2]: Entity Framework и модульность
От: Artem Korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 17.07.17 21:12
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Один модуль — одна сборка .Net И не поставлять клиенту сборки которые он не купил.


Сборка должна быть одна и та же. Софт облачный, так что физический набор сервисов один и тот же для всех клиентов. Разница будет в схемах баз данных и имеющихся в них таблицах.
С уважением, Artem Korneev.
Re: Entity Framework и модульность
От: Shmj Ниоткуда  
Дата: 17.07.17 21:34
Оценка: :)
Здравствуйте, Artem Korneev, Вы писали:

AK>Что посоветует вселенский разум?


Это я спрашивал 2 недели назад: http://rsdn.org/forum/dotnet/6829275.flat
Автор: Shmj
Дата: 04.07.17


Совпадение? Не думаю...
=сначала спроси у GPT=
Re[3]: Entity Framework и модульность
От: Vasiliy2  
Дата: 18.07.17 06:35
Оценка:
Здравствуйте, Artem Korneev, Вы писали:


AK>Сборка должна быть одна и та же. Софт облачный, так что физический набор сервисов один и тот же для всех клиентов. Разница будет в схемах баз данных и имеющихся в них таблицах.


Если сборка должна быть одна и та же, то в ней можно сделать интерфейс обращения к объектам (если переходим на ORM, то мы уже говорим больше об обращении к объектам а не к таблицам) и метаинтерфейс для инициализации основного интерфейса.Для основного интерфейса сделать две реализации. При инициализации основного интерфейса можно с помощью прямого запроса (реализация метаинтерфейса) проверить наличие таблиц. Если таблицы присутствуют, то основному интерфейсу отдавать рабочую реализацию (с помощью метаинтерфейса). Если таблиц нет, то инициализировать интерфейс заглушкой. Т.е. получаем DI и четко выделенный слой DAL.
Re: Entity Framework и модульность
От: rm822 Россия  
Дата: 19.07.17 05:14
Оценка:
Здравствуйте, Artem Korneev, Вы писали:

AK>День добрый, коллеги.


AK>Их наличие зависит от того, купил ли пользователь соответствующие модули или нет.

Вот это уже неправильно. Предположим я клиент, попробовал триалку. Таблицы появились. Решил не покупать, а таблицы все равно есть.
И оставлю как есть, куплю через 6 мес, когда бюджет будет

AK>Я работаю над тем чтобы заменить всё это на Entity Framework.

И зачем?
Re: Entity Framework и модульность
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 19.07.17 07:38
Оценка: 66 (2) +1
Здравствуйте, Artem Korneev, Вы писали:

AK>Что посоветует вселенский разум?

Очень сложно советовать, не зная всей вашей специфики, поэтому, предложу вариант исходя из своего понимания вашей схемы работы.

Вы сказали, что у вас облачное решение, но с точки зрения работы с базой у вас не мультитенант, а у каждого клиента своя база. При этом само приложение всегда деплоится целиком, со всем набором модулей. А "купил/не купил" — это просто настройка в runtime (условно говоря табличка в базе администрирования у кого какие features куплены). Так?

Если я всё верно понял, то я бы предложил делать так:

По поводу последнего пункта немного раскрою. У нас была в чем-то похожая задача: клиент может приобрести часть модулей и в зависимости от того, что он купил, его сотрудники видят тот или иной функционал. Как у нас это было сделано:

Т.е. у нас как таковые данные не принадлежали какому-то модулю, ограничение шло по доступным действиям.

Если же у вас требуется именно фильтрация данных я бы подумал всё равно о варианте типа того, что выше, с той лишь разницей, что вы подключаете какой-либо AOP фреймворк, который будет перехватывать обращения к полям ваших сущностей, и если доступа нет, возвращать пустые данные
Re[2]: Entity Framework и модульность
От: Artem Korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 28.07.17 17:37
Оценка:
Здравствуйте, rm822, Вы писали:

AK>>Их наличие зависит от того, купил ли пользователь соответствующие модули или нет.

R>Вот это уже неправильно. Предположим я клиент, попробовал триалку. Таблицы появились. Решил не покупать, а таблицы все равно есть.

У нас нет триалок. Это b2b сегмент.

AK>>Я работаю над тем чтобы заменить всё это на Entity Framework.

R>И зачем?

Не люблю спагетти-код.
С уважением, Artem Korneev.
Re[3]: Entity Framework и модульность
От: rm822 Россия  
Дата: 31.07.17 11:51
Оценка: -1
AK>>>Я работаю над тем чтобы заменить всё это на Entity Framework.
R>>И зачем?
AK>Не люблю спагетти-код.
Все это выглядит как "мне лень разбираться, поэтому перепишу-ка я этот код"
"у этого кода есть фатальный недостаток, он написан не мной!"
Re: Entity Framework и модульность
От: CyberRussia  
Дата: 31.07.17 14:19
Оценка:
Здравствуйте, Artem Korneev

Работал я с модульным проектом подобного типа. "Навеселившись" с ним вынес для себя главное — делать модульным не только базу данных, но и работающую с ней бизнес-логику. Причем максимально независимо разводить модули (и базы и бизнес-логики) друг от друга. В идеале, чтобы они друг о друге ничего не знали, а при необходимости общения, делали это через базовое ядро, которое и будет контролировать разрешение/запрещение на работу модуля для конкретного клиента. Таким образом раз и навсегда снимается вопрос "есть или нет для этого клиента та или иная таблица в БД".
Re[4]: Entity Framework и модульность
От: Artem Korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 01.08.17 17:03
Оценка:
Здравствуйте, rm822, Вы писали:

AK>>Не люблю спагетти-код.

R>Все это выглядит как "мне лень разбираться, поэтому перепишу-ка я этот код"


Нет, там реально спагетти-код. Entity Framework сам по себе не превратит это в конфетку, но позволит хотя бы не мешать SQL-код с C# кодом, я смогу убрать прямую генерацию кривых SQL-запросов из кода с бизнес-логикой в data access layer.
С уважением, Artem Korneev.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.