使用Service Installer在.NET Core中配置依赖注入而无需任何代码
目录
介绍
描述
在本文中,我将解释如何使用一个名为IServiceInstaller的接口,您可以在配置依赖注入时使用它,然后使用简单的反射代码自动读取它。
介绍
这是我们配置IServiceInstaller接口的方式:
public interface IServiceInstaller
{void InstallServices(IServiceCollection services, AppSettings appSettings, Assembly startupProjectAssembly);
}
描述
“appSettings”参数是一个类,其中包含所有“appsettings.json”文件配置值。您您确实可以使用IConfiguration并将对象传递给StartUp类。当您想在API层以外的另一层中实现这些文件时,使用“startupProjectAssembly”参数。
然后这就是我们使用反射来实现ConfigureServices方法的扩展方法的方式:
public static class ServiceInstallerExtensions{public static void InstallServicesInAssemblies(this IServiceCollection services, AppSettings appSettings){var startupProjectAssembly = Assembly.GetCallingAssembly();var assemblies = new[] { startupProjectAssembly, Assembly.GetExecutingAssembly() };var installers = assemblies.SelectMany(a => a.GetExportedTypes()).Where(c => c.IsClass && !c.IsAbstract && c.IsPublic && typeof(IServiceInstaller).IsAssignableFrom(c)).Select(Activator.CreateInstance).Cast<IServiceInstaller>().ToList();installers.ForEach(i => i.InstallServices(services, appSettings, startupProjectAssembly));}}
最终,在添加所有服务之后,我们实现如下ConfigureServices方法:
public void ConfigureServices(IServiceCollection services){//* HttpContextAccessor// services.AddHttpContextAccessor();//* Controllersservices.AddControllers(options => { options.Filters.Add(new AuthorizeFilter()); }).AddNewtonsoftJson();//* Installersservices.InstallServicesInAssemblies(_appSettings);}
完成了。现在,所有IServiceInstaller实现的服务将自动在ConfigureServices中注册。
我们使用AutoRegisterDi包自动注册DI服务。现在我们建立一个名为:
public class RegisterServicesUsingAutoRegisterDiInstaller : IServiceInstaller{public void InstallServices(IServiceCollection services, AppSettings appSettings, Assembly startupProjectAssembly){var dataAssembly = typeof(SomeRepository).Assembly;var serviceAssembly = typeof(SomeService).Assembly;var webFrameworkAssembly = Assembly.GetExecutingAssembly();var startupAssembly = startupProjectAssembly;var assembliesToScan = new[] { dataAssembly, serviceAssembly, webFrameworkAssembly, startupAssembly };#region Generic Type Dependenciesservices.AddScoped(typeof(IRepository<>), typeof(Repository<>));#endregion#region Scoped Dependency Interfaceservices.RegisterAssemblyPublicNonGenericClasses(assembliesToScan).Where(c => c.GetInterfaces().Contains(typeof(IScopedDependency))).AsPublicImplementedInterfaces(ServiceLifetime.Scoped);#endregion#region Singleton Dependency Interfaceservices.RegisterAssemblyPublicNonGenericClasses(assembliesToScan).Where(c => c.GetInterfaces().Contains(typeof(ISingletonDependency))).AsPublicImplementedInterfaces(ServiceLifetime.Singleton);#endregion#region Transient Dependency Interfaceservices.RegisterAssemblyPublicNonGenericClasses(assembliesToScan).Where(c => c.GetInterfaces().Contains(typeof(ITransientDependency))).AsPublicImplementedInterfaces(); // Default is Transient#endregion#region Register DIs By Nameservices.RegisterAssemblyPublicNonGenericClasses(dataAssembly).Where(c => c.Name.EndsWith("Repository")&& !c.GetInterfaces().Contains(typeof(ITransientDependency))&& !c.GetInterfaces().Contains(typeof(IScopedDependency))&& !c.GetInterfaces().Contains(typeof(ISingletonDependency))).AsPublicImplementedInterfaces(ServiceLifetime.Scoped);services.RegisterAssemblyPublicNonGenericClasses(serviceAssembly).Where(c => c.Name.EndsWith("Service")&& !c.GetInterfaces().Contains(typeof(ITransientDependency))&& !c.GetInterfaces().Contains(typeof(IScopedDependency))&& !c.GetInterfaces().Contains(typeof(ISingletonDependency))).AsPublicImplementedInterfaces();#endregion}}
使用Service Installer在.NET Core中配置依赖注入而无需任何代码相关推荐
- ASP.NET Core 中的依赖注入
什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要依赖于抽象,不要依赖于具体.而控制反转(Ioc)就是这样的原则的其中一个实现思路, 这个思路的其中一种实现方式就是依赖 ...
- winform防止sqlserver注入_ASP.NET Core 中的 依赖注入介绍
ASP.NET Core 依赖注入 HomeController public class HomeController : Controller { private IStudentReposito ...
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...
- ASP.NET Core中的依赖注入(2):依赖注入(DI)
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...
- .NET CORE——Console中使用依赖注入
我们都知道,在 ASP.NET CORE 中通过依赖注入的方式来使用服务十分的简单,而在 Console 中,其实也只是稍微绕了个小弯子而已.不管是内置 DI 组件或者第三方的 DI 组件(如Auto ...
- Spring使用注解配置依赖注入
大部分情况下,使用Spring配置依赖注入时,都是使用注解来进行配置,因为注解比xml要方便和简单.不过类似于数据源对象这种配置信息容易变更的对象除外,这种对象使用xml文件来进行配置会更适合,方便于 ...
- ASP.NET CORE MVC 2.0 如何在Filter中使用依赖注入来读取AppSettings
问: ASP.NET CORE MVC 如何在Filter中使用依赖注入来读取AppSettings 答: Dependency injection is possible in filters as ...
- ASP.NET Core - 在ActionFilter中使用依赖注入
上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的,所以花了点时间仔细阅读了微软的官方文档.发现除了IActionFilter.I ...
- Angular 中的依赖注入link
Angular 中的依赖注入link 依赖注入(DI)是一种重要的应用设计模式. Angular 有自己的 DI 框架,在设计应用时常会用到它,以提升它们的开发效率和模块化程度. 依赖,是当类需要执行 ...
最新文章
- asp.net oracle参数传递,asp.net – Oracle参数问题中的链接数据库
- java channelexec_java-使用SSH exec通道调用Shell脚本,但忽略对其他Shell脚本的调用
- mysql oracle 表空间大小_Oracle各种空间大小及占用大小
- 两名黑客因发现特斯拉漏洞获Model 3一辆和3.5万美元奖金
- Git学习笔记1--Git原理简单介绍
- Markdown编辑器中字号、颜色的设置方法及一些好看的颜色示例
- 在使用springMVC时,页面报的404异常
- javascript中的this指向问题总结
- Xcode8上传app一直显示正在处理
- Android 常用抓包工具介绍之Charles
- 微信公众号项目(公众号关注登录网站)
- Speedoffice(word)如何设置分栏
- java工程师的工作述职报告,java程序员述职报告
- linux系统盘不要超过2T,linux 分区方法(超过2T的硬盘)
- The Chubby lock service for loosely-coupled distributed systems 论文阅读笔记
- 科技文献挖掘工具平台与关键技术综述
- signature=fc89d4352b6699754c14ce282ec75426,Ballistic demining protective armor
- Silicon Zigbee3.0 EmberZNet入门教程0——安装SSv5(Simplicity Studio v5)IDE软件
- Stm32f030数字电源开发 Stm32同步buck降压数字电源
- 长沙学院20级训练赛-原魔题解
热门文章
- gitlab php自动化测试,自动化发布-GitLab WEB Hooks 配置
- 谷歌浏览器修复工具_奇安信代码卫士协助谷歌修复漏洞 获官方致谢
- java正方形个圆形面积_java计算图形面积(圆形,正方形, 长方形).pptx
- Linux Kernel TCP/IP Stack|Linux网络硬核系列 | 图
- 进程、地址空间、文件、I/O、保护、虚拟内存
- OpenStack概念结构与逻辑架构:Conceptual architecture and Logical architecture
- TensorFlow运作方式入门
- Linux查看显示编辑文本文件
- php表达式求值,PHP实现基于栈的后缀表达式求值功能
- python3 绝对值_Python的绝对值最大的数字,python