如何解决DI - 在构造函数中自动初始化 IOptions<T>
信息:仍然不适用于 C# 9 计划用于 C# 10,但即使从那个 #10 最近移开...... 来源:https://github.com/dotnet/csharplang/issues/2691
原始问题从这里开始:
在 C# 9 中,依赖倒置(通过 ctor 注入)的语法得到了简化。
来自:
public class MyManager
{
private readonly ILogger<MyManager> _logger;
private readonly MyService _myService;
public MyManager(ILogger<MyManager> logger,MyService myService)
{
_logger = logger;
_myService = myService;
}
}
致:
public class MyManager
{
public MyManager(ILogger<MyManager> _logger,MyService _myService)
{ }
}
我们如何通过这种简化来涵盖 IOptions<MySettings>
情况?
public class MyManager
{
private readonly MySettings _mySettings;
public MyManager(ILogger<MyManager> _logger,MyService _myService,IOptions<MySettings> mySettings)
{
_mySettings = mySettings.Value;
}
}
应用相同的简化模式不起作用
public class MyManager
{
// private readonly MySettings _mySettings; // remove it to simplify DI
public MyManager(ILogger<MyManager> _logger,IOptions<MySettings> _mySettings)
{ }
}
因为 _mySettings
应该是 MySettings
类型,而不是 IOptions<MySettings>
类型。
注意:通过隐式应用相同的模式,我们可以承认 _mySettings
不会是 MySettings
类型,而是 IOptions<MySettings>
。但是在代码中使用 _mySettings.Value.SpeficSettingField
之类的东西很奇怪。
后期更新: (冒着违反 StackOverflow 规则的风险,将 URL 发布到源“myth busters” :) C# digest -> this week's favorite -> C# Coding Guidelines & Practices
解决方法
真的不是答案。现在这个功能还为时过早:)
正如@Yair 提到的:这仍然不适用于 C# 9。
我找到了文档的网址:https://github.com/dotnet/csharplang/issues/2691
根据它:在语言版本规划中计划用于 10.0 Candidate,但不幸的是在 2021 年 2 月 6 日(可能会在以后的版本中)从中删除
现在我会将问题标记为已解决,但稍后会给出正确的答案,当我们对 PrimaryContructors
玩得开心时 - 我们将这样称呼它们。
感谢包容
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。