.NET Core中依賴注入已經是最常見的編程方式,所以基於約定進行自動依賴注入非常有必要,可以簡化工作量和減少出錯的概率,
目前進行自動掃描注入的工具為Scrutor,通過一個接口錨點進行自動掃描注入,如下述的IAutoInject,IScopedAutoInject 等接口就是錨點
分為2種注入方式:
1.接口實現類型的注入,如services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
2.注入自身 services.AddScoped<RequestToHttpHelper>();
其中:
1.IAutoInject :默認以接口和實現的方式注入Scoped 例:services.AddScoped<ITest, TestImplment>();
2.IScopedAutoInject :以接口和實現的方式注入Scoped(同上)例:services.AddScoped<ITest, TestImplment>();
3.ISingletonAutoInject:自動注入接口和實現Singleton類型 例:services.AddSingleton<ITest, TestImplment>();
4.ITransientAutoInject:自動注入接口和實現Transient類型 例:services.AddTransient<ITest, TestImplment>();
5.ISelfScopedAutoInject:自動注入自身Scoped類型 例:services.AddScoped<Test>();
6.ISelfSingletonAutoInject:自動注入自身Singleton類型 例:services.AddSingleton<Test>();
7.ISelfTransientAutoInject:自動注入自身Transient類型 例:services.AddTransient<Test>();
代碼如下:
using Microsoft.Extensions.DependencyInjection; using Scrutor; using System.Reflection; using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Http; namespace NetCore3WebApiTemplate { public static class RegisterService { public static void RegisterComponents(IServiceCollection services) { //自動注入IAutoInject services.Scan(x => { var entryAssembly = Assembly.GetEntryAssembly(); var referencedAssemblies = entryAssembly.GetReferencedAssemblies().Select(Assembly.Load); var assemblies = new List<Assembly> { entryAssembly }.Concat(referencedAssemblies); x.FromAssemblies(assemblies) .AddClasses(classes => classes.AssignableTo(typeof(IAutoInject))) .AsImplementedInterfaces() .WithScopedLifetime() //接口注冊Scoped .AddClasses(classes => classes.AssignableTo(typeof(IScopedAutoInject))) .AsImplementedInterfaces() .WithScopedLifetime() //接口注冊Singleton .AddClasses(classes => classes.AssignableTo(typeof(ISingletonAutoInject))) .AsImplementedInterfaces() .WithSingletonLifetime() //接口注冊Transient .AddClasses(classes => classes.AssignableTo(typeof(ITransientAutoInject))) .AsImplementedInterfaces() .WithTransientLifetime() //具體類注冊Scoped .AddClasses(classes => classes.AssignableTo(typeof(ISelfScopedAutoInject))) .AsSelf() .WithScopedLifetime() //具體類注冊Singleton .AddClasses(classes => classes.AssignableTo(typeof(ISelfSingletonAutoInject))) .AsSelf() .WithSingletonLifetime() //具體類注冊Transient .AddClasses(classes => classes.AssignableTo(typeof(ISelfTransientAutoInject))) .AsSelf() .WithTransientLifetime(); }); } } }
using System; using System.Collections.Generic; using System.Text; namespace NetCore3WebApiTemplate { /// <summary> /// 自動注入掃描點默認為Scoped /// </summary> public interface IAutoInject { } /// <summary> /// 自動注入接口和實現Scoped類型 /// </summary> public interface IScopedAutoInject { } /// <summary> /// 自動注入接口和實現Singleton類型 /// </summary> public interface ISingletonAutoInject { } /// <summary> /// 自動注入接口和實現Transient類型 /// </summary> public interface ITransientAutoInject { } /// <summary> /// 自動注入自身Scoped類型 /// </summary> public interface ISelfScopedAutoInject { } /// <summary> /// 自動注入自身Singleton類型 /// </summary> public interface ISelfSingletonAutoInject { } /// <summary> /// 自動注入自身Transient類型 /// </summary> public interface ISelfTransientAutoInject { } }
使用方式如下:
public class TestImplment:ITest,IAutoInject { }
public class CompanyController : ControllerBase { private readonly ITest test; public CompanyController(ITest test) { this.test= test; } }
在startup的ConfigureServices的方法追加RegisterService.RegisterComponents(services);即可,代碼如下
/// <summary> /// This method gets called by the runtime. Use this method to add services to the container. /// </summary> /// <param name="services"></param> public void ConfigureServices(IServiceCollection services) { //注冊服務 RegisterService.RegisterComponents(services); }
注意:RegisterService所在項目需要引用需要掃描的注入接口和類,不然無法掃描到。
請嘗試網頁搜索