Использование Funq ServiceStack для LazyResolve зависимостей - PullRequest
0 голосов
/ 27 июня 2018

Мы используем ServiceStack в API-сервисе, размещенном в Интернете, и уже некоторое время делаем это. Путь выполнения для любого запроса следует шаблону:

Запрос приходит:

-> Служба (обрабатывает запрос, использует IManager, введенный через конструктор)

-> IManager (выполняет бизнес-логику, использует IRepository / s, которые вводятся через конструктор)

-> IRepository / ies (SQL Server, NoSQL, использует фабрику соединений / соединений, введенную конструктором)

Теперь, когда мы развлекаем другого клиента, некоторые из этих запросов должны следовать несколько иной бизнес-логике и потенциально использовать другую стратегию репо. Тем не менее, API будет оставаться последовательным. С этой целью я извлекаю специфичную для клиента логику (конкретные реализации IManager и IRepository выше) для разделения сборок. Я написал компонент, который проверяет текущий контекст запроса, идентифицируя клиента, для которого этот запрос, который затем использует отражение и активатор для создания экземпляра конкретной реализации, которую я хочу выполнить для любого данного запроса.

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

Я тут схожу с ума? Мой API в основном состоит именно в этом: пользовательская логика, которая возникает, изолирована от специфических для клиента сборок, которые вызываются во время выполнения. Это все имеет смысл для меня в теории, но на практике это вызов. Мысли? Идеи?

1 Ответ

0 голосов
/ 28 июня 2018

Если вы хотите разрешить только временные зависимости во время выполнения, вы можете просто разрешить их из IOC, как необходимо в вашей службе, с помощью:

base.TryResolve<T>();

В любом фильтре от IRequest с:

req.TryResolve<T>();

Или внешне вне ServiceStack с:

HostContext.TryResolve<T>();
...