我想在 ASP.NET CORE 1 中实现依赖注入 . 我知道一切都与.Net Core中的DI有关 . 例如
public void ConfigureServices(IServiceCollection services)
{
// Add application services.
services.AddTransient<IDateTime, SystemDateTime>();
}
但对于拥有20多个实体和服务的Big项目,在ConfigureServices中编写所有这些代码行是如此困难和难以理解 . 我想知道这是否可能在Startup.cs之外实现依赖注入,然后将其添加到服务中 .
谢谢你的回答 .
4 回答
您可以编写IServiceCollection的扩展方法,将大量服务注册封装到Startup.cs中的一行代码中
例如,这是我项目中的一个:
在Startup.cs中,我用一行代码调用该方法
有几种方法可以采用,但有些方法只是在类之间移动代码;我建议你考虑
Assembly Scanning
,我将其描述为下面的第二个选项:1. 'MOVE THE PROBLEM': EXTENSION METHODS
最初的选项是使用
extension methods
来配置服务 .以下是将多个服务重新创建包装到一个扩展方法中的一个示例:
这可以在
ConfigureServices
内调用:Note: 这对于特定配置(例如,当服务需要向其传递多个选项时)作为'builder pattern'是有用的,但是,不能解决必须通过手动编码注册多个服务的问题;它与编写相同的代码但在不同的类文件中基本没什么不同,它仍然需要手动维护 .
2. 'SOLVE THE PROBLEM': ASSEMBLY SCANNING
'best practice'选项是Assembly Scanning,用于根据
Implemented Interfaces
自动查找和注册组件 . 下面是一个Autofac示例:处理注册生命周期(或范围)的一个技巧是使用标记接口(空接口),例如
IScopedService
,并使用它来扫描和注册具有适当生命周期的服务 . 这是注册多个服务的最低摩擦方法,这是自动的,因此'zero maintenance' .Note :内置的ASP.Net Core DI实现不支持
Assembly Scanning
(如pf current,2016发布);但是,Github(和Nuget)上的Scrutor项目添加了此功能,它将服务和类型注册压缩为:SUMMARY :
Assembly Scanning
,与Extension Methods
(适用时)相结合将为您节省大量维护费用,并在应用程序启动时执行一次,然后进行缓存 . 它不需要手动编码服务注册 .您可以编写批量注册的扩展方法:
用法:
我最近实现了Assembly扫描方法(成功),但最终发现cluster_registrations_in_a_few_extension_methods方法更加清晰,可供我自己和其他程序员阅读 . 如果将注册聚类保持在已定义注册类的位置附近,则维护工作总是比注册类本身所涉及的维护工作少得多 .