Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавить фабрику сервиса данных #64

Open
NicholasNoise opened this issue Jan 30, 2020 · 0 comments
Open

Добавить фабрику сервиса данных #64

NicholasNoise opened this issue Jan 30, 2020 · 0 comments

Comments

@NicholasNoise
Copy link
Contributor

NicholasNoise commented Jan 30, 2020

Цель

Требуется возможность определять сервис данных, через которого производится запрос в БД, на основании типа данных обрабатываемого объекта.

Функциональные требования

При выполнении Post и Patch запросов производится загрузка мастеровых объектов в глубину с использованием сервиса данных, который был указан в конструкторе сервиса данных.
Данная возможность частично может быть реализована через кастомную реализацию IHttpControllerActivator, с помощью разбора можно запроса можно получить тип данных, например, для чтения объектов подсистемы полномочий, если она расположена в другой БД.
В общем случае такой сценарий вполне адекватен, однако, если в БД используются foreign table, а данные в них вытягиваются через fdw, то оптимальнее будет напрямую обращаться к целевой БД, минуя fdw.

Требования к реализации

Для реализации данной возможности необходимо:

  • добавить в DataObjectController виртуальный метод IDataService GetDataService(Type), который будет возвращать экземпляр сервиса данных в зависимости от использованного конструктора:
    return _dataService;
  • все обращения к приватному полю _dataService заменить на метод GetDataService.

Опционально (т.к. будет достаточно для переопределения на прикладном проекте):

  • изменить тело метода GetDataService на: return _dataService ?? _factory.Create(type);
  • выделить интерфейс IDataServiceFactory с один методом IDataService Create(Type)
  • добавить новый конструктор для DataObjectController:
    public DataObjectController(IDataServiceFactory, DataObjectCache, DataObjectEdmModel ,IEventHandlerContainer, IFunctionContainer)
  • существующий конструктор пометить атрибутом [InjectionConstructor] для обратной совместимости

Тесты

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

Аналоги, примеры реализации

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant