Как реализовать чтение и выполнение запросов из DBContext в портативной библиотеке?

Задача: есть система, выполняющая работу. У этой системы есть свои плагины (.dll-ки); в этих библиотеках определяется бизнес-логика задачи. Система сама сканирует папку с плагинами, подгружает .dll-ки на лету, запускает и обрабатывает.

Проблема: так как эти библиотеки должны возвращать какой-то ответ, слишком много макаронного кода получилось в виду большого объема данных. Получается, сейчас мы в системе делаем выборку из базы, потом передаём в dll-ки, а потом принимаем ответ и обновляем базу.

Вопрос: возможно ли сделать так, чтобы .dll-ки принимали какой-то DBContext, и там уже работали с базой данных? Если да, то как такое реализовать?
  • Вопрос задан
  • 322 просмотра
Пригласить эксперта
Ответы на вопрос 1
DarkRaven
@DarkRaven
разработка программного обеспечения
В целом, можно.
Можно сделать сервис-локатор уровня приложения, посредством которого все модули могут получать те или иные сервисы.

А дальше, просто: Регистрируете сервис, который отдает нужную логику или просто Unit Of Work по верх DbContext-а и используете из плагина.
ApplicationBoostrap:
private void ConfigureContainerBuilder(ContainerBuilder builder)
        {
            builder.Register(c => EngineConfigurationHandler.Current)
                .As<IConfiguration>().SingleInstance();

            //Зарегистрируем сервисы 
            builder.RegisterAssemblyModules(typeof(RegisterDomainIocModule).Assembly);
            builder.RegisterAssemblyModules(typeof(BaseService<>).Assembly);
            builder.RegisterAssemblyModules(typeof(Bootstrapper).Assembly);
        }


И, где-то в недрах:

using(var uov = ApplicationContext.Resolve<IUnitOfWork>())
{
    var data = uov.Query<SomeDomainModel>().Where(...);

    uow.Save(new SomeDomainModel{  Name = "Name" });
    uow.Commit();
}


Почему я сказал про Unit Of Work,а не конкретный DbContext - потому что DbContext вы не контролируете, в отличии от вашего же Unit Of Work. И, соответственно, поддержку будет сделать куда проще. Опять же, в Unit Of Work вы можете напихать дополнительную логику пост- и пре-обработки (фильтрация по флагу IsDeleted), автоматическое присвоение ModifyDate при сохранение и т.п.

P.S. и да, я надеюсь, вы не имели ввиду Portable Library, вот тогда вам точно не обойтись от своих абстракций, определенных именно в Portable Library и повсеместно эксплуатируемых.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы