EFCore上下文的使用到深入剖析DI的生命周期最后实现自动属性注入的步骤如下:
- EFCore上下文的使用:
在使用EFCore上下文之前需要在代码中引入EFCore包,并且按需注册服务。通常我们使用AddDbContext
方法进行上下文服务注册。
services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MyDB")));
其中,MyDbContext
是我们自己实现的EFCore上下文类,Configuration.GetConnectionString("MyDB")
是我们在配置文件中定义的连接字符串。
- DI的生命周期:
在ASP.NET Core中我们使用DI(依赖注入)来处理对象之间的依赖关系。DI最常使用的三种生命周期是:Singleton
、Scoped
和Transient
。其中,Singleton
生命周期的对象只会被创建一次,然后在整个应用程序域中使用;Scoped
生命周期的对象在每个HTTP请求期间只会被创建一次;而 Transient
生命周期的对象在每次请求时都会被创建。
我们可以使用.AddSingleton()
、.AddScoped()
和.AddTransient()
方法来注册服务,并设置对象的生命周期。
以下是一个例子:
services.AddScoped<IMyService, MyServiceImpl>();
在上述代码中,IMyService
是我们自己定义的一个服务接口,MyServiceImpl
是我们自己实现的服务接口的实现类,在这里我们使用了AddScoped()
方法来将其注册为Scoped生命周期的服务。
- 自动属性注入
自动属性注入是一种依赖注入技术,在ASP.NET Core中可以通过 attribute 实现。通常,我们使用 [FromServices] 这个 attribute 来实现自动属性注入。
以下是两个示例说明:
例一:实现一个需要从上下文中获取数据的服务类
public class MyService : IMyService
{
private readonly MyDbContext _context;
public MyService([FromServices] MyDbContext context)
{
_context = context;
}
public List<User> GetUserList()
{
return _context.Users.ToList();
}
}
在上述代码中,我们通过 [FromServices]
attribute 来实现了自动属性注入。这里我们需要从上下文中获取数据,所以在构造函数中注入了 MyDbContext
对象,通过这个对象访问数据库中的 User 表。
例二:自己实现 attribute 来实现自动属性注入
我们可以自己实现 attribute 以及对应的 attribute 处理器来实现自动属性注入。
自定义 attribute:
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
public class MyCustomAttribute : Attribute {}
自定义 attribute 处理器:
public class MyCustomAttributeProcessor : IParameterInfoValueProviderFactory
{
private readonly IServiceProvider _serviceProvider;
public MyCustomAttributeProcessor(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public ValueProvider? Create(ParameterInfo parameterInfo)
{
if (parameterInfo == null) throw new ArgumentNullException(nameof(parameterInfo));
if (parameterInfo.GetCustomAttribute<MyCustomAttribute>() == null) return null;
return new ServiceProviderValueProvider(_serviceProvider);
}
}
使用自定义 attribute:
public class MyService : IMyService
{
private readonly MyDbContext _context;
public MyService([MyCustom] MyDbContext context)
{
_context = context;
}
public List<User> GetUserList()
{
return _context.Users.ToList();
}
}
在上述代码中,我们通过 [MyCustom]
attribute 注册了自己实现的自动属性注入处理器。
最后,在注册服务时需要将自定义 attribute 处理器注册为 MVC 的全局服务:
services.AddSingleton<IParameterInfoValueProviderFactory, MyCustomAttributeProcessor>();
以上就是从EFCore上下文的使用到深入剖析DI的生命周期最后实现自动属性注入的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:从EFCore上下文的使用到深入剖析DI的生命周期最后实现自动属性注入 - Python技术站