- 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/
这2个有什么区别?一个使用 SideEffect,另一个不使用。 “每次成功重组都会调用 SideEffect”,但如果没有 SideEffect,它也会在每次重组时运行。 @Composable f
我在 DOM 元素引用方面遇到了一些问题,我想我已经追踪到它与更新 innerHTML 有关。 在这个例子中,在第一次警告时,两个变量引用同一个元素,正如预期的那样。奇怪的是,在更新父元素(body)
如果有人问过这个问题,请原谅我,但我似乎找不到它。 我正在尝试创建一个数组并反转它(不使用反转)这段代码完美运行: function reverseArrayInPlace(array) { fo
如果 reflector 是正确的(我倾向于相信它是正确的),这就是 Any() 的实现: public static bool Any(this IEnumerable source) {
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
是否可以用 LINQ 中的 lambda 表达式替换 foreach 循环 (.Select))? List l = {1, 2, 3, 4, 5}; foreach (int i in l)
我在一本书上读到以下说法: n = ((i++) > (j)?(i++):(j)); 书上说假设i>j,n有一个意想不到的值,i增加了两次。 我不明白为什么n在这句话之后有一个期望值。 我读了很多关于
我对更改 LD_LIBRARY_PATH 有奇怪的副作用。 当我附加一个包含库的路径时,例如: LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib 然后,一切都
有人能告诉我下面一行中“副作用”的含义吗? If you're calling an EL function that doesn't return anything, then you're cal
是否有为包含副作用的 Java/JVM 语言方法编写 javadoc 的标准或最佳实践? 我定义了一个 void 方法,它修改了方法参数之一,但不知道如何记录实际返回值(因为没有实际返回)。 /**
我正在学习副作用和纯函数。我知道纯函数没有副作用,对于相同的参数,它们的返回值是相同的。我想知道 C 函数 strcmp() 是否是纯函数。我相信它是纯粹的,因为给定相同的两个字符串作为参数,结果将始
我正在尝试创建佛罗里达州的点密度图。虽然我知道 Highmaps 不支持带有 map 点的颜色轴。我扩展了它并且它有效,但它带来了副作用。当我单击图例中的某一类别时,不会发生隐藏。例如,如果我单击“>
我在 CS50 中研究 PSET 4,似乎遇到了 sprintf 更改不相关变量的问题。我只给出了没有揭示我的解决方案的代码...... #include #include #include t
我已经实现了这样的 UnaryOperation struct Converter { Converter( std::size_t value ): value_( valu
使用点符号调用自定义 getter 是否有副作用? 我一直在通过点符号在 Objective-C 中使用合成的 getter,即 tree.fruitnumber 返回树中果实的数量。我必须自定义 s
我无法理解页面 https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/void 中的这一段: This ope
我有一个在 IIS7 下运行的 Web 应用程序。我将全局变量存储在一个带有静态变量的类中。该类称为 SessionVariables 并且在其中例如我有以下内容: public class Sess
运行命令时 ng-packagr -p ng-package.json 我得到以下输出 Building Angular library - - - skipped 8 lines - - - Sid
我想模拟一个 OverflowError 因为我想在引发异常之后测试变量的值。但是,我不知道如何使用我正在使用的库复制 OverflowError。我在此特定测试中使用的库是 pysolar.sola
当我尝试在可变 Map 中插入一个元素时,我希望这个元素插入到我的 Map 而不是返回 Map(如 PF,不可变对象(immutable对象) ecc ...)出于这个原因,我使用了可变集合,但在我的
我是一名优秀的程序员,十分优秀!