- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有时,在服务注册期间,我需要从 DI 容器解析其他(已经注册的)服务。对于像 Autofac 或 DryIoc 这样的容器,这没什么大不了的,因为您可以在一行上注册服务,在下一行上您可以立即解决它。
但是对于微软的 DI 容器,你需要注册服务,然后建立一个服务提供者,然后你才能从那个 IServiceProvider
解析服务。实例。
请参阅此 SO 问题的已接受答案:ASP.NET Core Model Binding Error Messages Localization
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => { options.ResourcesPath = "Resources"; });
services.AddMvc(options =>
{
var F = services.BuildServiceProvider().GetService<IStringLocalizerFactory>();
var L = F.Create("ModelBindingMessages", "AspNetCoreLocalizationSample");
options.ModelBindingMessageProvider.ValueIsInvalidAccessor =
(x) => L["The value '{0}' is invalid."];
// omitted the rest of the snippet
})
}
ModelBindingMessageProvider.ValueIsInvalidAccessor
消息,答案建议解决
IStringLocalizerFactory
通过基于当前服务集合构建的服务提供者。
最佳答案
每个服务提供者都有自己的缓存。因此,构建多个服务提供者实例会导致一个名为 Torn Lifestyles 的问题。 :
When multiple [registrations] with the same lifestyle map to the same component, the component is said to have a torn lifestyle. The component is considered torn because each [registration] will have its own cache of the given component, which can potentially result in multiple instances of the component within a single scope. When the registrations are torn the application may be wired incorrectly which could lead to unexpected behavior.
With containers like Autofac or DryIoc this was no big deal since you could register the service on one line and on the next line you could immediately resolve it.
ContainerBuilder
和 MS.DI 的
ServiceCollection
)中进行注册来做到这一点。另一方面,Simple Injector 不会进行这种拆分。相反,它会在解析第一个实例后锁定容器,以免进行任何修改。然而,效果是相似的。它会阻止您在解决后添加注册。
Imagine the scenario where you want to replace some
FileLogger
component for a different implementation with the sameILogger
interface. If there’s a component that directly or indirectly depends onILogger
, replacing theILogger
implementation might not work as you would expect. If the consuming component is registered as singleton, for example, the container should guarantee that only one instance of this component will be created. When you are allowed to change the implementation ofILogger
after a singleton instance already holds a reference to the “old” registered implementation the container has two choices—neither of which are correct:
- Return the cached instance of the consuming component that has a reference to the “wrong”
ILogger
implementation.- Create and cache a new instance of that component and, in doing so, break the promise of the type being registered as a singleton and the guarantee that the container will always return the same instance.
Startup
类定义了两个独立的阶段:
ConfigureServices
方法),在此您将注册添加到“容器构建器”(又名 IServiceCollection
)Configure
方法),您可以通过设置路由来声明要使用 MVC。在此阶段,IServiceCollection
已变成IServiceProvider
这些服务甚至可以被方法注入(inject)到Configure
方法。 IStringLocalizerFactory
)推迟到“使用”阶段,并随之推迟依赖于服务解析的事物的最终配置。
ModelBindingMessageProvider
时,这似乎会导致先有鸡还是先有蛋的因果困境。因为:
ModelBindingMessageProvider
需要使用 MvcOptions
类(class)。 MvcOptions
类仅在“添加”( ConfigureServices
)阶段可用。 IStringLocalizerFactory
并且无法访问容器或服务提供者,并且不能通过使用 Lazy<IStringLocalizerFactory>
创造这样的值(value)来推迟解决它。 . IStringLocalizerFactory
可用,但此时没有 MvcOptions
不再可以用来配置 ModelBindingMessageProvider
. Startup
中使用私有(private)字段。类并在
AddOptions
的闭包中使用它们.例如:
IStringLocalizerFactory
时甚至可能不存在的问题,这是一种丑陋的解决方法。 ;在这种特殊情况下,创建一个临时服务提供者来解决本地化工厂可能会正常工作。然而,实际上很难分析您是否会遇到麻烦。例如:
ResourceManagerStringLocalizerFactory
,这是默认的本地化工厂,不包含任何状态,它依赖于其他服务,即 IOptions<LocalizationOptions>
和 ILoggerFactory
.两者都配置为单例。 ILoggerFactory
实现(即 LoggerFactory
),由服务提供者创建,而 ILoggerProvider
之后可以将实例添加到该工厂。如果您的第二个 ResourceManagerStringLocalizerFactory
会发生什么取决于自己ILoggerFactory
执行?这样做会正确吗? IOptions<T>
— 由 OptionsManager<T>
实现.它是一个单例,但是 OptionsManager<T>
本身取决于 IOptionsFactory<T>
并包含自己的私有(private)缓存。如果有第二个 OptionsManager<T>
会发生什么对于特定的 T
?这在 future 会改变吗? ResourceManagerStringLocalizerFactory
怎么办被替换为不同的实现?这是一个不太可能发生的情况。依赖关系图会是什么样子,如果生活方式被破坏会引起麻烦吗? ModelBindingMessageProvider
时,似乎没有捷径可走。这是 IMO ASP.NET Core MVC 中的一个设计缺陷。希望微软会在 future 的版本中解决这个问题。
关于c# - 在 ConfigureServices() 中调用 BuildServiceProvider() 的成本和可能的副作用是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56042989/
所以我一直在尝试以 JWT 分发的形式设置一个带有 token 身份验证的小型测试 api, token 分发部分按预期工作。 然而,由于我想让我的 JWT 服务的方法更通用,以允许对 token 进
如果一个类有两个构造函数,当我在 ConfigureServices 中注册该服务时,服务容器如何选择使用哪一个? 所以假设我有一个名为 MyClass 的类(class)有对应的接口(interfa
我正在使用 Auth0 的 SDK 进行身份验证,并在他们的 sample code 中使用,他们在 ConfigureServices() 中创建了一个事件监听器,例如 OnRedirectToId
您将如何从 configureServices 内部访问配置Giraffe-FSharp 中的方法? 这是 SAFE template 创建的 Giraffe 设置的节选部分通过 dotnet new
我在 Startup.cs 中有类似的代码 services.Configure( Configuration.GetSection("AppSettings")); services.Add
我想在 ConfigureServices 中注册一个通用类(需要这个类,因为我想实现模式:存储库和工作单元)以获得依赖注入(inject)。但是我不知道怎么办。 这是我的界面: public int
关注点分离 (SoC) ConfigureServices 中注册的依赖指令(启动类的方法)由不同的 DI 组成,如 Repository、Fluent Validations 等。 我将如何将 DI
我要配置 ASP.NET Core Identity基于驻留在数据库中的设置而不是 AppSetting.json或硬编码值。因此,我很想在方法 ConfigureServices(IServiceC
在我的 ConfigureServices 方法中,我想读取一个文件(在我的例子中是一个用于签署 token 的证书,但它可以是设置服务所需的任何文件)。因此,我需要知道 IApplicationEn
在 ConfigureServices 方法中一次添加 httpContextAccessor 与为每个 HttpClient 配置添加 HttpContextAccessor 之间有什么区别。 pu
我创建了一个记录器,它应该在应用程序运行启动期间记录任何内容。我希望它在 Startup 和 ConfigureServices 之间持续存在。我将它存储在类似于配置的属性中 这是代码 public
我创建了一个记录器,它应该在应用程序运行启动期间记录任何内容。我希望它在 Startup 和 ConfigureServices 之间持续存在。我将它存储在类似于配置的属性中 这是代码 public
我有一个 .Net Core 项目,它注册了一些单例,如下所示: public void ConfigureServices(IServiceCollection services) { se
有时,在服务注册期间,我需要从 DI 容器解析其他(已经注册的)服务。对于像 Autofac 或 DryIoc 这样的容器,这没什么大不了的,因为您可以在一行上注册服务,在下一行上您可以立即解决它。
在我的 ASP.Net Core 应用程序中,我需要在 ConfigureServices 方法中注入(inject)一些依赖项(在我的例子中是一个存储库)。 问题是该方法不允许使用多个参数来注入(i
自 2018 年 5 月 30 日起,我在 Startup.cs 中的 ASP.NET Core 代码 public IServiceProvider ConfigureServices(IServi
我需要在 ASP core 3.0 中使用这个 AutoFac 当我在启动时使用这段代码: public IServiceProvider ConfigureServices(IServiceColl
是否可以解析 IOptions 的实例?来自 ConfigureServices启动时的方法? The documentation explicitly says : Don't use IOptio
我通常会做以下事情 static void Main() { IConfiguration config = new ConfigurationBuilder()
我有一个 ASP.NET Core 3 应用程序,并且正在使用 AzureAD 进行身份验证。我的 Startup.ConfigureSerivces 方法中有以下几行,其目的是在附加 cookie
我是一名优秀的程序员,十分优秀!