【发布时间】:2021-02-22 10:16:56
【问题描述】:
信息: 仍然不适用于 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,
MyService _myService,
IOptions<MySettings> _mySettings)
{ }
}
因为_mySettings 应该是MySettings 类型,而不是IOptions<MySettings> 类型。
注意:通过隐式应用相同的模式,我们可以承认_mySettings 不是MySettings 类型,而是IOptions<MySettings>。但是在代码中使用 _mySettings.Value.SpeficSettingField 这样的东西很奇怪。
稍后更新: (冒着违反 StackOverflow 规则的风险,将发布一个 URL 到源“神话终结者”:) C# digest -> this week's favorite -> C# Coding Guidelines & Practices
【问题讨论】:
-
您所说的关于 C# 9 的内容不正确。也许您对记录感到困惑?
-
@YairHalberstadt - 我已经看到在 C# 摘要上发表的,在“本周最喜欢的”主题下(请原谅发布源名称......至少我不会将 URL 粘贴到源以避免违反 StackOverflow 规则)。我已经对 Microsoft 文档进行了搜索以查看任何文档,但是没有成功(可能是原始/早期):)
-
它不存在,也不在管道中:-)。我会知道 - 我是 C# 语言设计团队的社区大使之一。我会试着找到这篇文章...
-
我知道 typescript 支持语法,很高兴看到上面提到的文章中的信息。为了试验这一点,我快速更新了解决方案控制器中的 ctor,并且看到 VS 语法检查器没有抱怨。但是,编译仍然根本不起作用。同时,我也进行了搜索以检查如何使用 IOptions
,但是因为没有找到我向社区询问的任何内容……但是,社区中的某个人似乎出奇地沮丧:) :( 我不知道'看不出问题有什么问题。如果该功能仍然不适用,也许我们很快就会有它。
标签: constructor options c#-9.0