Asp.net core 使用Dapper的存储库模式依赖项注入

Asp.net core 使用Dapper的存储库模式依赖项注入,asp.net-core,Asp.net Core,MyStartup.cs包含40个存储库: services.AddScoped<IUserRepository, UserRepository>(); services.AddScoped<IXRepository, XRepository>(); ... 40 more lines ... 您需要的是基于约定的注册。这使您能够注册所有类型,例如以Repository结尾的类型,作为它们实现的接口。但是,内置的ASP.NET核心IOC非常轻量级,不提供此类功能。因此,

My
Startup.cs
包含40个存储库:

services.AddScoped<IUserRepository, UserRepository>();
services.AddScoped<IXRepository, XRepository>();
... 40 more lines ...

您需要的是基于约定的注册。这使您能够注册所有类型,例如以
Repository
结尾的类型,作为它们实现的接口。但是,内置的ASP.NET核心IOC非常轻量级,不提供此类功能。因此,您可以使用扫描所有引用程序集的代码将其包装起来,按模式查找类型,然后将其添加到ServiceCollection,也可以使用提供此功能并支持.Net Core的不同IOC实现,例如Autofac、StructureMap等。

您可以使用

它为Microsoft.extensions.DependencyInjection提供程序集扫描和装饰扩展

所有这些存储库都可以归纳为以下内容:

services.Scan(x => x.FromAssemblyOf<IAnAssemblyRegistrationMarker>()
        .AddClasses(filter => filter.AssignableTo(typeof(IRepository)))
        .AsImplementedInterfaces()
        .WithScopedLifetime());
services.Scan(x=>x.FromAssemblyOf())
.AddClasses(filter=>filter.AssignableTo(typeof(IRepository)))
.AsImplementedInterfaces()
.使用ScopedLifeTime());
IAnAssemblyRegistrationMarker
是指向要扫描的程序集(项目)的空界面

AddClasses
从所选程序集中添加所有符合

AsImplementedInterfaces
将每个匹配的具体类型注册为其所有实现的接口

使用ScopedLifeTime
将每个匹配的具体类型注册为作用域生存期(您还可以使用
使用SingleToLifeTime
使用TransientLifetime

上面代码示例中的唯一要求是存储库实现
IRepository
,以便您只针对必要的项目


免责声明:我与Scrutor没有任何关联。我很喜欢这件事。

你要找的是
基于约定的注册
。例如,您可以知道您想要注册所有以
存储库
结尾的类作为它们实现的接口。不幸的是,内置的ASP.NET核心IOC非常有限,无法提供此类功能。因此,您可以使用扫描所有引用程序集的代码将其打包,寻找与模式匹配的类并将它们添加到ServiceCollection中,或者您可以使用提供此功能的不同IOC实现,例如AutofacIs有没有办法以这种方式更改我的实现以提供一行解决方案?我唯一想到的是,您可以实现通用接口,并且实现实体类型,然后像
services.AddScoped(typeof(IGenericRepository)、typeof(genericreepository))
一样注册,但在这种情况下,您将不会有太多的灵活性。是的,我现在正在深入研究基于约定的注册。我很确定这是一条路。Thx兄弟。我建议你把它贴出来作为答案。我认为这可以帮助其他人。我读过很多关于通用实现的书,没有一个关于基于约定的注册的字。请将其中一个答案标记为已接受
services.Scan(x => x.FromAssemblyOf<IAnAssemblyRegistrationMarker>()
        .AddClasses(filter => filter.AssignableTo(typeof(IRepository)))
        .AsImplementedInterfaces()
        .WithScopedLifetime());