使用微软官方库 Microsoft.Extensions.DependencyInjection
在WPF中使用
public sealed partial class App : Application
{
public App()
{
Services = ConfigureServices();
this.InitializeComponent();
}
/// <summary>
/// Gets the current <see cref="App"/> instance in use
/// </summary>
public new static App Current => (App)Application.Current;
/// <summary>
/// Gets the <see cref="IServiceProvider"/> instance to resolve application services.
/// </summary>
public IServiceProvider Services { get; }
/// <summary>
/// Configures the services for the application.
/// </summary>
private static IServiceProvider ConfigureServices()
{
var services = new ServiceCollection();
services.AddSingleton<IFilesService, FilesService>();
services.AddSingleton<ISettingsService, SettingsService>();
services.AddSingleton<IClipboardService, ClipboardService>();
services.AddSingleton<IShareService, ShareService>();
services.AddSingleton<IEmailService, EmailService>();
return services.BuildServiceProvider();
}
}
主要接口
IServiceCollection
作用:用于注册服务的接口,可向服务集合中添加各种服务。在应用启动时,通常会创建一个 ServiceCollection 实例来开始服务注册过程。
常用方法AddTransient<TService, TImplementation>()
将服务以瞬态生命周期注册到服务集合中,每次请求该服务时都会创建一个新的实例。AddScoped<TService, TImplementation>()
以作用域生命周期注册服务,在每个作用域内只会创建一个实例。AddSingleton<TService, TImplementation>()
以单例生命周期注册服务,在整个应用程序生命周期内只会创建一个实例。Add(ServiceDescriptor descriptor)
手动添加一个 ServiceDescriptor 对象,该对象包含了服务的类型、实现类型和生命周期信息。IServiceProvider
作用:用于解析服务的接口。当服务注册完成并构建服务容器后,会得到一个实现了 IServiceProvider 接口的对象,通过该对象可以获取已注册的服务实例。
常用方法GetService(Type serviceType)
尝试获取指定类型的服务实例,如果服务未注册则返回 null。GetRequiredService(Type serviceType)
获取指定类型的服务实例,如果服务未注册则抛出异常。ServiceDescriptor
作用:表示一个服务的注册信息,包含服务的类型、实现类型和生命周期等信息。可以通过手动创建 ServiceDescriptor 对象并添加到 IServiceCollection 中来实现更灵活的服务注册。
构造函数ServiceDescriptor(Type serviceType, Type implementationType, ServiceLifetime lifetime)
根据服务类型、实现类型和生命周期创建一个 ServiceDescriptor 对象。ServiceDescriptor(Type serviceType, Func<IServiceProvider, object> implementationFactory, ServiceLifetime lifetime)
使用工厂方法创建 ServiceDescriptor 对象,适用于需要自定义服务实例创建逻辑的场景。
// 创建服务集合
using Microsoft.Extensions.DependencyInjection;
using System;
// 定义服务接口
public interface IMyService
{
void DoWork();
}
// 定义服务实现类
public class MyService : IMyService
{
public void DoWork()
{
Console.WriteLine("MyService is working.");
}
}
class Program
{
static void Main()
{
// 创建服务集合
IServiceCollection services = new ServiceCollection();
// 注册服务
services.AddTransient<IMyService, MyService>();
// 手动创建 ServiceDescriptor 并注册
var descriptor = new ServiceDescriptor(typeof(IMyService), typeof(MyService), ServiceLifetime.Transient);
services.Add(descriptor);
// 构建服务容器
IServiceProvider serviceProvider = services.BuildServiceProvider();
// 解析服务
IMyService myService = serviceProvider.GetRequiredService<IMyService>();
myService.DoWork();
// 尝试解析服务,如果未注册返回 null
IMyService? nullableService = serviceProvider.GetService<IMyService>();
if (nullableService != null)
{
nullableService.DoWork();
}
}
}
本文由 jxxxy 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。