Skip to content

RsCode2.0

RsCode2.0以后使用微软内置DI容器,并且支持泛型注入,支持应用程序集接口自动注入。

应用程序集接口自动注入步骤:

第一步:在需要自动注入的接口添加标记,示例:

csharp
//指定实例生命周期 需要自动完成注册的接口添加标记
[ScopedService] //作用域(Scoped)生命周期服务在每个作用域内被创建一次
//[SingletonService] //单例(Singleton)生命周期服务在它们第一次被解析时创建,并且每个后续解析将使用相同的实例
//[TransientService] //瞬时(Transient)生命周期服务在它们每次请求时被创建
public interface IDemo
{}

第二步:调用自动注入应用程序集接口

csharp
//自动注入某个应用程序集接口
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()

csharp
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时的配置

csharp
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()

csharp
services.AddMvc().AddControllersAsServices();
csharp
   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访问

csharp
using AspectCore.Extensions.DependencyInjection;
var memberService = services.BuildServiceContextProvider().GetRequiredService<IMemberAppService>();