То, что вы видите, это две вселенные сталкиваются; обе библиотеки DI имеют свое собственное несовместимое определение того, что значит быть переходным :
- Simple Injector рассматривает компоненты с
Transient
образом жизни как недолговечные или краткие . Вот почему Simple Injector не позволяет вводить переходные процессы в компоненты с определенными областями; область видимости может жить гораздо дольше, чем считается краткое .
- ASP.NET Core вообще не считает временные компоненты недолговечными . Вместо этого ожидаемый срок службы компонента
Transient
в .NET Core должен составлять при условии, что предполагаемый срок службы его потребителя . В документах даже говорится, что «это время жизни лучше всего подходит для легких служб без сохранения состояния».
Именно из-за этого поведения контейнер Microsoft.Extensions.DependencyInjection (MS.DI) позволяет внедрять переходные процессы как для одноэлементных, так и для ограниченных потребителей.
Я бы даже сказал, что Microsoft неправильно называет их образ жизни, потому что в действительности поведение состоит в том, чтобы иметь один экземпляр на зависимость потребителя. Microsoft, похоже, скопировала это поведение из Autofac. Autofac, однако, называет этот же стиль жизни InstancePerDependency
, что является гораздо более очевидным именем, если вы спросите меня.
Странно, однако, что метод расширения AddLocalization
от Microsoft регистрирует StringLocalizer<T>
как переходный процесс. Это странно, потому что, кроме обернутого IStringLocalizer
, StringLocalizer<T>
не имеет никакого состояния. И не только это, IStringLocalizer
, который он оборачивает, создается введенным IStringLocalizerFactory
и, как можно ожидать, будет тем же экземпляром (что подтверждается тем фактом, что ResourceManagerStringLocalizerFactory
кэширует возвращаемых экземпляров ).
Как указано выше, в MS.DI Transient
означает «Я проживу так же долго, как и мой потребитель. «Это практически означает, что экземпляр StringLocalizer<T>
может жить столько же, сколько и единичный, что означает: на протяжении всего приложения.
В этом отношении на самом деле действительно странно , когда команда локализации выбрала StringLocalizer<T>
, чтобы вести переходный образ жизни, даже в MS.DI. Переходный процесс только означает, что создано больше экземпляров, а IStringLocalizerFactory
вызывается чаще, чем требуется. Я нахожу Singleton
гораздо более очевидным образом жизни для этой регистрации.
Короче говоря, я бы предложил переопределить регистрацию по умолчанию с помощью синглтона, так как в любом случае это безопасно:
services.AddLocalization();
services.AddSingleton(typeof(IStringLocalizer<>), typeof(StringLocalizer<>));