Использование Funq ServiceStack для LazyResolve зависимостей

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

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

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

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

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

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

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

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

1 ответ

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

base.TryResolve<T>();

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

req.TryResolve<T>();

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

HostContext.TryResolve<T>();
Другие вопросы по тегам