DI - 在构造函数中自动初始化 IOptions<T>
DI - automatically initialize IOptions<T> in constructor
信息: 仍然不适用于 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)
{ }
}
How can we cover the IOptions<MySettings>
case with this simplification also ?
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,
MyService _myService,
IOptions<MySettings> _mySettings)
{ }
}
因为 _mySettings
应该是 MySettings
类型,而不是 IOptions<MySettings>
类型。
注意:通过隐式应用相同的模式,我们可以承认 _mySettings
不是 MySettings
类型,而是 IOptions<MySettings>
。但是在代码中使用像 _mySettings.Value.SpeficSettingField
这样的东西很奇怪。
稍后更新:
(冒着违反 Whosebug 规则的风险,将 post 一个 URL 到来源“神话破坏者”:)
C# digest -> this week's favorite -> C# Coding Guidelines & Practices
真的不是答案。该功能还为时过早:)
正如@Yair 提到的:这仍然不适用于 C# 9。
我在文档中找到了 url:https://github.com/dotnet/csharplang/issues/2691
根据它:原计划在语言版本规划中用于 10.0 Candidate,但不幸的是,它已于 2021 年 2 月 6 日从中删除(可能用于更高版本)
现在我要将问题标记为已解决,但稍后会给出正确的答案,届时我们会玩得开心 PrimaryContructors
- 这就是我们对它们的称呼。
感谢包容
信息: 仍然不适用于 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)
{ }
}
How can we cover the
IOptions<MySettings>
case with this simplification also ?
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,
MyService _myService,
IOptions<MySettings> _mySettings)
{ }
}
因为 _mySettings
应该是 MySettings
类型,而不是 IOptions<MySettings>
类型。
注意:通过隐式应用相同的模式,我们可以承认 _mySettings
不是 MySettings
类型,而是 IOptions<MySettings>
。但是在代码中使用像 _mySettings.Value.SpeficSettingField
这样的东西很奇怪。
稍后更新: (冒着违反 Whosebug 规则的风险,将 post 一个 URL 到来源“神话破坏者”:) C# digest -> this week's favorite -> C# Coding Guidelines & Practices
真的不是答案。该功能还为时过早:)
正如@Yair 提到的:这仍然不适用于 C# 9。
我在文档中找到了 url:https://github.com/dotnet/csharplang/issues/2691
根据它:原计划在语言版本规划中用于 10.0 Candidate,但不幸的是,它已于 2021 年 2 月 6 日从中删除(可能用于更高版本)
现在我要将问题标记为已解决,但稍后会给出正确的答案,届时我们会玩得开心 PrimaryContructors
- 这就是我们对它们的称呼。
感谢包容