RsCode2.0
RsCode2.0
以后使用微软内置DI容器,并且支持泛型注入,支持应用程序集接口自动注入。
应用程序集接口自动注入步骤:
第一步:在需要自动注入的接口添加标记,示例:
//指定实例生命周期 需要自动完成注册的接口添加标记
[ScopedService] //作用域(Scoped)生命周期服务在每个作用域内被创建一次
//[SingletonService] //单例(Singleton)生命周期服务在它们第一次被解析时创建,并且每个后续解析将使用相同的实例
//[TransientService] //瞬时(Transient)生命周期服务在它们每次请求时被创建
public interface IDemo
{}
第二步:调用自动注入应用程序集接口
//自动注入某个应用程序集接口
services.AutoInject("RsCode.xxx.MySql");
//或自动注册指定程序集,例
string[] assemblieName = new string[] { "RsCode.Web", "RsCode.Application" };
services.AutoInject(assemblieName);
没有标记生命周期的接口,需要自写代码完成注入
RsCode 1.0
以下是之使用AspectCore版本时的文档
一 激活DI
1.1 .net core3.x以上版本时的配置
NuGet 引用 AspectCore.Extensions.Hosting
在Program.cs 中激活 UseServiceContext()
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceContext() //激活aspectcore
.ConfigureWebHostDefaults(webBuilder =>
{
var host = AppSettings.Get("WebHost");
webBuilder.UseStartup<Startup>().UseUrls(host);
}) ;
1.2 .net core2.x时的配置
public IServiceProvider ConfigureServices(IServiceCollection services)
{
...其它
services.AutoRegister("Service"); //Service为您的程序集名称,仅此一行即可
//在控制器中使用属性注入
services.AddMvc().AddControllersAsServices();
return services.GetServiceProvider(); //激活DI
}
二 自动注入应用程序中的接口
在asp.net core项目中,可以根据程序集名称自动完成注入 AutoRegister(项目名称) 遍历指定名称应用程序中的接口,自动完成注入
services.AutoRegister("Project.Service");
三.构造注入与属性注入的实例
RsCode提供了构造注入与属性注入两种方式
属性注入标签 [FromServiceContext]
,如果要在Controller中使用,需要Startup中配置AddControllersAsServices()
services.AddMvc().AddControllersAsServices();
public interface IFF : IScopedDependency
{
int Add(int a, int b);
}
public class FF : IFF
{
[FromServiceContext]
IAA aa { get; set; }//属性注入
public int Add(int a, int b)
{
int c = aa.Add(100);
return a + b+c;
}
}
public interface IAA:IScopedDependency
{
int Add(int a);
}
public class AA:IAA
{
public int Add(int a)
{
return a + 100;
}
}
DI生命周期
ITransientDependency 瞬时(Transient)生命周期服务在它们每次请求时被创建。
ISingletonDependency 单例(Singleton)生命周期服务在它们第一次被解析时创建,并且每个后续解析将使用相同的实例
IScopedDependency 作用域(Scoped)生命周期服务在每个作用域内被创建一次
注意:
如果使用AspectCore代替默认DI时,使用BuildServiceContextProvider
访问
using AspectCore.Extensions.DependencyInjection;
var memberService = services.BuildServiceContextProvider().GetRequiredService<IMemberAppService>();
© 2022 rscode.cn MIT license