.NET 8 中的 Keyed Services解锁依赖注入的新方式(最新推荐)
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">什么是Keyed Services?</a></li><li><a href="#_label1">如何使用Keyed Services?</a></li><li><a href="#_label2">在控制器中使用</a></li><li><a href="#_label3">好处与限制</a></li><li><a href="#_label4">结论</a></li></ul></div><p>在.NET 8 发布之后,依赖注入(Dependency Injection,DI)体系迎来了一个全新的功能——Keyed Services。这篇博客将带你探索如何通过Keyed Services来实现基于特定键选择服务实例的方法。</p><p class="maodian"><a name="_label0"></a></p><h2>什么是Keyed Services?</h2>
<p>传统的DI容器允许你注册服务,但并没有提供一个简单的方式来区分同一个接口的不同实现。Keyed Services的引入解决了这个问题,它允许你使用键(可以是任何类型,包括字符串、枚举等)来标识不同的服务实例。</p>
<p class="maodian"><a name="_label1"></a></p><h2>如何使用Keyed Services?</h2>
<p>让我们以一个具体的示例来展示如何在.NET 8 中使用Keyed Services。</p>
<p>假设我们有一个接口<code>ISampleC</code>,它有两个实现:<code>SampleD</code>和<code>SampleE</code>。我们希望根据一个枚举值来选择具体的实现。</p>
<p>首先,定义枚举类型:</p>
<div class="jb51code"><pre class="brush:csharp;">public enum ServiceInstanceEnum { SampleE, SampleD }
</pre></div>
<p>然后,在<code>Program.cs</code>或<code>Startup.cs</code>中注册服务:</p>
<div class="jb51code"><pre class="brush:csharp;">builder.Services.AddKeyedScoped<ISampleC, SampleD>(ServiceInstanceEnum.SampleD);
builder.Services.AddKeyedScoped<ISampleC, SampleE>(ServiceInstanceEnum.SampleE);
</pre></div>
<p>这里,我们使用<code>AddKeyedScoped</code>方法将<code>SampleD</code>和<code>SampleE</code>分别与枚举值关联起来。</p>
<p class="maodian"><a name="_label2"></a></p><h2>在控制器中使用</h2>
<p>在控制器中注入特定服务实例:</p>
<div class="jb51code"><pre class="brush:csharp;">public class WeatherForecastController : Controller
{
private readonly ISampleC _sampleC;
public WeatherForecastController(
ILogger<WeatherForecastController> logger,
ISampleC sampleC)
{
_logger = logger;
_sampleC = sampleC;
}
// 控制器的其他方法
}</pre></div>
<p>通过<code></code>特性,我们可以指定需要注入的<code>ISampleC</code>实例的键值。</p>
<p class="maodian"><a name="_label3"></a></p><h2>好处与限制</h2>
<ul><li><p><strong>好处</strong>:</p>
<ul><li>更灵活的服务选择方式。</li><li>避免了创建工厂方法或手动实例化服务的繁琐。</li><li>能够直接利用DI容器管理服务的生命周期。</li></ul></li><li><p><strong>限制</strong>:</p>
<ul><li>需要.NET 8 及以上版本。</li><li>对于大量键值的管理,可能需要额外的配置和设计考虑。</li></ul></li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>结论</h2>
<p>Keyed Services 是一个强大的工具,它扩展了.NET DI 容器的能力,使得服务的选择和注入变得更加直观和灵活。通过这篇博客的介绍和示例,你应该能够开始在自己的项目中尝试和使用这一新特性。记住,DI 容器不仅仅是用来注入依赖的,它还可以帮助你管理复杂的服务实例选择逻辑,提高代码的可维护性和可测试性。</p>
頁:
[1]