Я использую Simple Injector с проектом ASP.NET Web API, и я хочу использовать разные реализации для одного интерфейса в зависимости от используемой версии конечной точки REST. Например, если используется v1 конечной точки, IPaymentData
должен быть создан с классом PaymentData
, но если используется v2, то IPaymentData
должен быть реализован классом PaymentDataNew
. Это оказывается проблематичным!Регистрация смены простого инжектора во время выполнения
Я не хочу использовать составной класс, как часть документации Simple Injector, потому что это означает, что мой код должен быть в курсе и учитывать инфраструктуру внедрения, которую я использую (плохой).
Я заметил в последней версии (3.0) что-то, что называется "Context based injection". Используя функцию container.RegisterConditional
, должно быть возможно запустить делегат каждый раз, когда тип будет разрешен.
container.RegisterConditional(typeof(IPaymentData),
c => ((HttpContext.Current.Items["version"] as string ?? "1") == "2")
? typeof(PaymentDataNew)
: typeof(PaymentData),
Lifestyle.Scoped,
c => true);
Это не похоже на работу, хотя, так как даже если время жизни области видимости, и образ жизни по умолчанию WebApiRequestLifestyle
делегат, который возвращает реализацию в зависимости от версии вызывается только для первого запроса, который приходит в Последующие запросы пропускают это (они, похоже, используют кэшированную реализацию).
Есть ли что-то, что мне не хватает? Как я могу убедиться, что делегат вызывается каждый раз, когда приходит запрос?
Спасибо, @Steven :). Мое понимание вашего превосходного инжектора зависимости является рудиментарным, но постепенно улучшается. Престижность в документации также! – Torfi