.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所在項目需要引用需要掃描的注入接口和類,不然無法掃描到。
請嘗試網頁搜索
