Мы используем ServiceStack в API-сервисе, размещенном в Интернете, и уже некоторое время делаем это. Путь выполнения для любого запроса следует шаблону:
Запрос приходит:
-> Служба (обрабатывает запрос, использует IManager, введенный через конструктор)
-> IManager (выполняет бизнес-логику, использует IRepository / s, которые вводятся через конструктор)
-> IRepository / ies (SQL Server, NoSQL, использует фабрику соединений / соединений, введенную конструктором)
Теперь, когда мы развлекаем другого клиента, некоторые из этих запросов должны следовать несколько иной бизнес-логике и потенциально использовать другую стратегию репо. Тем не менее, API будет оставаться последовательным. С этой целью я извлекаю специфичную для клиента логику (конкретные реализации IManager и IRepository выше) для разделения сборок. Я написал компонент, который проверяет текущий контекст запроса, идентифицируя клиента, для которого этот запрос, который затем использует отражение и активатор для создания экземпляра конкретной реализации, которую я хочу выполнить для любого данного запроса.
Однако из-за этого я не могу просто зарегистрировать реализации IManager и IRepository в контейнере при запуске - это необходимо решать динамически для каждого запроса. Я хотел бы сделать что-нибудь вроде LazyResolve, но я не могу найти какого-либо убедительного примера того, как это сделать, чтобы я начал здесь.
Я тут схожу с ума? Мой API в основном состоит именно в этом: пользовательская логика, которая возникает, изолирована от специфических для клиента сборок, которые вызываются во время выполнения. Это все имеет смысл для меня в теории, но на практике это вызов. Мысли? Идеи?