asp.net html注入,在ASP.NET Core中实现自动注入、批量注入

我们在使用AddScoped、AddTransient、AddSingleton这类方法的时候很是麻烦。我们每增加一个接口以及其实现的时候,是不是需要在这里硬编码注册一行代码呢?项目小还好,但当我们的项目变得庞大之后,这里的依赖注入怎么来维护呢?

在网上翻了半天,看了很多方法,其实现代码感觉都很不优雅,想想还是自己写一个比较实用吧,我们只需按照一个规定来定义和实现接口。应用程序就能自动扫描并注册这些程序集中的接口和对应实现类,完成依赖注入的自动注册,具体的实现可以通过接口或特性来实现,如果需要区分AddScoped、AddTransient、AddSingleton可以通过定义不同的接口去实现,这里我们定义IDenpendency接口做演示,具体实现如下:

第一步:创建如下这样一个空接口

public interface IDenpendency { }

第二步:创建需要注入的功能接口,这类接口就是你想实现某些功能的封装,它们都继承第一步创建的接口IDenpendency,如下,我创建一个功能接口

public interface IUserService:IDenpendency

{

//function

}

第三步:实现需要注入的功能接口,如下,我创建了一个实现UserService的类

public class UserService:IUserService

{

//function的具体实现

}

第四步:扩展IServiceCollection批量注入方法AddDataService

public static classDataServiceExtension

{///

///注入数据///

///

public static IServiceCollection AddDataService(thisIServiceCollection services)

{#region 依赖注入

//services.AddScoped();

var baseType = typeof(IDependency);var path = AppDomain.CurrentDomain.RelativeSearchPath ??AppDomain.CurrentDomain.BaseDirectory;var referencedAssemblies = System.IO.Directory.GetFiles(path, "*.dll").Select(Assembly.LoadFrom).ToArray();var types =referencedAssemblies

.SelectMany(a=>a.DefinedTypes)

.Select(type=>type.AsType())

.Where(x=> x != baseType &&baseType.IsAssignableFrom(x)).ToArray();var implementTypes = types.Where(x =>x.IsClass).ToArray();var interfaceTypes = types.Where(x =>x.IsInterface).ToArray();foreach (var implementType inimplementTypes)

{var interfaceType = interfaceTypes.FirstOrDefault(x =>x.IsAssignableFrom(implementType));if (interfaceType != null)

services.AddScoped(interfaceType, implementType);

}#endregion

returnservices;

}

}

View Code

第四步:在Startup.cs调用AddDataService方法进行批量注入

本人原创文章,非商业用途可随意转载,转载请保留原文出处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值