Asp.net core 使用Dapper的存储库模式依赖项注入
MyAsp.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非常轻量级,不提供此类功能。因此,
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());