我们在使用 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 class DataServiceExtension
- {
- /// <summary>
- /// 注入数据
- /// </summary>
- /// <param name="services"></param>
- public static IServiceCollection AddDataService(this IServiceCollection services)
- {
- #region 依赖注入
- //services.AddScoped<IUserService, UserService>();
- 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 in implementTypes)
- {
- var interfaceType = interfaceTypes.FirstOrDefault(x => x.IsAssignableFrom(implementType));
- if (interfaceType != null)
- services.AddScoped(interfaceType, implementType);
- }
- #endregion
- return services;
- }
- }
- View Code
第四步: 在 Startup.cs 调用 AddDataService 方法进行批量注入
来源: http://www.bubuko.com/infodetail-3108740.html