首页
学习
活动
专区
圈层
工具
发布

ASP.NET Core 一个接口多个实现的依赖注入与动态选择

点击蓝字 关注我 ASP.NET Core 自带的依赖注入(DI)非常实用,但是当一个接口有多个实现的时候怎么操作呢?运行时能否根据配置选择其中一种实现呢?能不能不用反射呢?...很多小伙伴都有这样的疑问。今天我带大家看看如何在ASP.NET Core里不依赖反射,根据配置文件,在运行时动态选择一个接口的具体实现。 首先,这个需求其实来自我自己的博客系统。...(); services.AddTransient(); 构造函数注入 刚才我们注册了同一接口的两套实现,那么ASP.NET...构造函数居然还能这样注入 其实,在ASP.NET Core中,当你对一个接口注册了多个实现的时候,构造函数是可以注入一个该接口集合的,这个集合里是所有注册过的实现。...不依赖反射 刚才我们用反射无非就是为了在运行时获得具体实现的class的名字。所以其实只要自己给每个class都加上一个名字属性就行了。并且我们可以利用nameof()来增加代码可维护性。

4.3K30

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现...业务中对这两种实现方式都有用到 针对这种情况有如下两种实现方式: 第二种实现方式 其实,在ASP.NET Core中,当你对一个接口注册了多个实现的时候,构造函数是可以注入一个该接口集合的,这个集合里是所有注册过的实现...,因此我们需要设置下这个配置: 然后我们具体调用的依赖注入的方式需要变化一下: private readonly ISayHello sayHelloA; private readonly...这里我将介绍三种实现方式。 根据我们的配置文件中设置的key来进行动态的注入。...第二种实现方式,即接口参数的方式这样可以避免上个方法中反射所带来的性能损耗。

1.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Golang 单元测试详尽指引

    本文主要从单元测试出发,对Golang的单元测试框架、Stub/Mock框架进行简单的介绍和选型推荐,列举出几种针对于Mock场景的最佳实践,并以具体代码示例进行说明。 一、单元测试 1....功能可能依赖于数据库、web 访问、环境变量、系统时间等;一个单元可能依赖于另一部分代码,用例应该解除这些依赖 可读性。用例的名称、变量名等应该具有可读性,直接表现出该测试的目标 自动化。...,我认为我们不能走极端,当然理论上来说全写肯定时好的,但是从成本,效率上来说我们必须做出权衡,衡量原则如下: 优先编写核心组件和逻辑模块的测试用例 逻辑类似的组件如果存在多个,优先编写其中一种逻辑组件的测试用例...在本案例中,Model 层对服务层提供的接口不多,就WritePkg,ReadPkg两个核心函数,在服务层对其进行封装抽象为具体的业务逻辑。由于涉及网络连接,所以对其进行的测试必须编写桩函数。...由于涉及 Mock 和桩函数编写,可以使用GoStub、Monkey两个包进行这些工作,它们较简洁地实现了很多实用的测试方式,只需要用户编写依赖的接口文件、用于替换的 Mock 函数,就可以仅在测试过程中替换掉系统函数或者其它依赖的功能模块

    4.8K1158

    【Go工程化测试】业务项目中的Go单元测试心得

    但回到具体的工程项目里,当我们面对代码里的各种CRUD、接口与实现、内外部依赖时,往往发现很难写出有效的单元测试,空有一身技巧却无从下手。...我也被这个问题困扰许久,也反复在多个项目里折腾,发现要将单元测试落地到项目中,有一条被忽视的gap。下面我分享一下个人的思路。 Go单元测试的具体语法,本文会一笔带过,想了解细节的同学可以自行搜索。...自动生成 依赖注入DI 业务对象在初始化时注入想要的实现,遵循IoC的设计原则 正常情况下,注入业务实现;单元测试时,注入mock实现 一般可利用google的wire工具来自动化地生成依赖注入的代码...Dao层的里的业务实现代码也没有被调用(依赖注入的是mock实现),单测覆盖率也很低 既然我们的核心目标是 保障业务逻辑,那么,我们不妨从分层的角度分析一下:Controller层与Dao层的代码对核心业务逻辑的影响有多大...从具体实现中,提取出接口定义,重构代码的利器 写单元测试 testing.Main 统一进行单测依赖项的初始化与销毁的工作,减少重复性代码 gotests 生成具体单元测试代码的框架,少写很多代码,已集成到

    1.4K40

    ASP.NET MVC 4 - 测试驱动 ASP.NET MVC

    图 4 解决方案资源管理器中的测试项目 介绍针对您的体系结构的依赖关系注入 在您的待测试代码中遇到依赖关系前,对 n 层应用程序进行的单元测试不会前进多远。...依赖关系注入 依赖关系注入是注入一个类所要求的具体实现(而不是直接实例化该依赖关系的类)的过程。...使用类并不知道其任何依赖关系的实际具体实现,仅知道支持依赖关系的接口;具体实现由使用类或依赖关系注入框架提供。 依赖关系注入的目标是创建松散耦合程度高的代码。...较大的应用程序通常具有过多的依赖关系,以致无法通过对象的构造函数提供它们。 实现依赖关系注入的第三种方法是使用 DI/IoC 框架。...该函数接受泛型参数 T,该参数表示为其查找具体实现的接口;并且返回 T,这是传入接口的实际实现。

    6.7K70

    Go语言技巧 - 11.【初始化代码生成】Wire进阶使用

    绑定接口 接口这个特性在面向对象编程时非常有意义,我们来看一个具体的示例 // 抽象出一个 Messager 的接口 type Messager interface { Name() string }...// Message 是Messager的一个具体实现 type Message struct{} func (m *Message) Name() string { return "message..." } func NewMessage() *Message { return &Message{} } // Greeter的初始化依赖的是Messager接口,而不是Message这个实现 func...这个具体实现来代替Messager接口。...:依赖小到某个关键变量、大到某个外部服务,也同时注意组合相似度高的依赖项到Set; 小结 wire的核心是依赖注入,对整个框架的可测试性来说是根基,对Go语言这类静态编译的语言尤为重要。

    1.2K30

    依赖注入模式:软件架构的灵活之选

    属性(Setter)注入:通过对象的Setter方法传递依赖对象。 接口(Method)注入:通过接口定义注入方法,实现类中实现该方法以获得依赖对象。...其底层实现利用了依赖注入模式,使得开发者可以在不更改应用程序核心逻辑的情况下,切换不同的数据库驱动。 在database/sql包中,DB对象是数据库操作的核心。...开发者不需要关心具体的数据库驱动细节,只需通过DB对象提供的接口进行数据库操作。这一设计正是依赖注入模式的体现:DB对象依赖于一个数据库驱动,但这个依赖是在运行时注入的,而非硬编码在DB对象内部。...Go语言的数据库驱动通常注册自己到database/sql标准库中,这通过调用sql.Register函数实现。这个注册过程就是一种依赖注入,将具体的数据库驱动注入到sql包中。...依赖注入的好处 解耦合:database/sql包与具体的数据库驱动解耦,使得开发者可以轻松更换数据库而不影响业务逻辑代码。 易于测试:依赖注入使得在单元测试中可以注入模拟的数据库连接,便于测试。

    59810

    Wire,一个神奇的Go依赖注入神器!

    控制反转(IoC):这是个设计原则,它的意思是将对象创建的控制权从对象本身转移到外部。这样做的好处是可以减少对象之间的耦合,提高代码的灵活性。依赖注入(DI):这是实现 IoC 的具体方式。...这样,当我们想换数据库时,只需要提供一个新的数据库连接实现,就可以了。依赖注入解决了什么问题?DI 解决了以下几个问题:减少耦合:对象之间不再直接依赖具体实现,而是依赖抽象接口。...提高测试性:可以轻松地用 mock 对象替换真实的依赖,方便单元测试。增强灵活性:可以根据不同的场景,注入不同的依赖实现。...Wire 中有两个核心概念:提供者 provider 和 注入器 injector。提供者 providerprovider:提供者函数,用于创建特定类型的对象。它是 Wire 依赖注入的基本构建块。...User{name: name}}func NewUserName() string { return "James"}func (u *User) Get(message string) string

    27710

    Go 官方依赖注入工具wire

    wire是Go官方推出的一款类似于Spring依赖注入工具。有别于以往的依赖注入工具facebookgo/inject、uber-go/dig等,采用反射实现。...依赖注入是实现IoC解决依赖问题的设计模式。...Bind Bind 函数的作用是为了让接口类型的依赖参与 Wire 的构建。Wire 的构建依靠参数类型,接口类型是不支持的。Bind 函数通过将接口类型和实现类型绑定,来达到依赖注入的目的。...如果稍后在注入器实现中调用的提供者返回错误,注入器将使用它向调用者返回聚合清理函数或清理资源。...Wire 不允许在提供给 的提供者的传递闭包中存在一个类型的多个提供者wire.Build,因为这通常是一个错误。对于需要相同类型的多个依赖项的合法情况,您需要发明一种新类型来调用此其他依赖项。

    2.1K40

    面向对象的七大设计原则

    谁来干活(哪个具体的结构体)不管,只要你能按合同完成任务就行。 开闭原则的实现: 定义稳定的接口 (关上门):把系统中那些不变的、核心的操作抽象出来,写成接口。..." } 重构要点: 高层定接口:ReportService定义它需要什么功能 低层实现接口:MySQL/PostgreSQL实现这个接口 依赖注入:在main函数中"注入"具体实现...依赖注入与接口抽象的价值分析 你提出的问题非常关键——为什么需要这些看似"多余"的接口抽象和依赖注入?让我们深入分析这个设计模式的真正价值。 看似多余的代码?...接口,不关心具体数据库实现: type UserService struct { repo UserRepository // 依赖抽象接口,而非具体实现 } func NewUserService...人组合角色:通过切片聚合多个角色 动态增删:运行时添加/移除角色 符合现实:一个人可同时有多个身份 接口设计的五大核心原则(SOLID) SOLID 是五个原则的首字母缩写,具体包括

    13610

    Go的单元测试技巧

    识别依赖,抽象成接口 识别系统中的外部依赖,普遍来说,我们遇到最常见的依赖无非下面几种: 网络依赖——函数执行依赖于网络请求,比如第三方http-api,rpc服务,消息队列等等 数据库依赖 I/O依赖...Mock示例 Mock:在测试包中创建一个结构体,满足某个外部依赖的接口interface{} 生产代码: 1//auth.go 2//假设我们有一个依赖http请求的鉴权接口 3type AuthService...(token string) error{ 8 return nil 9} 在这里我们用authService实现了AuthService接口,这样测试Login,Logout就不再需需要依赖网络请求了...一个TCP服务肯定对net.Listener和net.Conn有很强的依赖,所以测试的重点就是如何破除这两个依赖,将其模拟出来。...文件中,其中内容也是参考了官方库的 net/http/server_test.go文件中的Mock方法。

    1.1K30

    我做了一个 Go 语言的微服务工具包

    OrderServiceServer 接口(生成的代码) 为了启动并运行 gRPC 服务,我们需要实现OrderServiceServer接口。...通过将OrderServiceServer接口注入到 REST 服务,我们可以正式实现这种“联姻”。...尽管 Go 提供了创建多个 init 函数的能力,但是应该尽量避免使用init。init函数有一些缺点,其中包括返回值为空。具体来说,Go 运行时(runtime) 将查找具有以下签名的包级函数 ?...函数执行任务所需的任何外部依赖(DB、Web 服务调用、事件生成器等)都可以作为参数注入到函数中。具有嵌入式依赖的函数很难测试。...即使我们可以在没有第三方的情况下 mock 外部依赖,这些框架仍然能为单元测试繁琐地方(如执行测试断言)提供了价值。 对队友是友好的。

    92110

    ASP.NET Core管道详解: 中间件委托链

    IApplicationBuilder是ASP.NET Core框架中的一个核心对象,我们将中间件注册在它上面,并且最终利用它来创建代表中间件委托链的RequestDelegate对象。...针对请求的处理实现在返回类型为Task的Invoke方法或者InvokeAsync方法中,该方法的第一个参数表示当前请求对应的HttpContext上下文,对于后续的参数,虽然约定并未对此做限制,但是由于这些参数最终是由依赖注入框架提供的...对于定义在中间件类型构造函数中的参数,如果有对应的服务注册,ASP.NET Core框架在创建中间件实例时可以利用依赖注入框架来提供对应的参数,所以在注册中间件时是不需要提供构造函数的所有参数的。...Core提供如下所示的MiddlewareFactory类型作为IMiddlewareFactory接口的默认实现,上面提及的中间件针对依赖注入的创建方式就体现在该类型中。...由于依赖注入框架自身具有针对提供服务实例的生命周期管理策略,所以MiddlewareFactory的Release方法不需要对提供的中间件实例做具体的释放操作。

    1.1K20

    fx框架上手-进阶篇

    具体来说,fx.Invoke 注册的函数会在应用程序启动时被调用,这些函数的参数会自动由 fx 提供的依赖注入机制解析并注入。...测试:在单元测试中,可以方便地将依赖注入到测试用例中,便于进行依赖的替换和注入。...提高代码可读性:通过使用全局变量或特定作用域的变量,可以使代码更加直观和易读。 测试友好:在测试环境中,可以方便地替换和注入依赖,便于进行单元测试和集成测试。...fx.As fx.As 是 fx 包中的一个选项,用于将具体类型转换为其接口类型进行依赖注入。...通过 fx.As,你可以在 fx.Provide 中指定将某个构造函数的返回值作为接口类型提供,使得依赖注入更加灵活和可扩展。这有助于实现松耦合和增强代码的可测试性。

    46710

    Go: 使用依赖注入实现Gin框架路由处理函数的解耦

    依赖注入的主要目的是为了提高代码的可测试性和可维护性。在Go语言中,依赖注入可以通过构造函数注入、属性注入等方式实现。...难以测试:由于处理函数直接依赖具体的业务逻辑,实现单元测试变得困难。 难以复用:路由处理函数无法在其他项目中复用,因为它们强依赖于当前项目的业务逻辑。...三、使用依赖注入解耦Gin框架 我们可以通过依赖注入将业务逻辑从路由处理函数中抽离出来,从而实现解耦。下面是一个具体的实现步骤。 1....定义接口和实现 首先,我们定义业务逻辑的接口和具体实现: go // service.go package service type User struct { ID int Name string...增强代码的复用性:业务逻辑实现可以在其他项目中复用,而不依赖于具体的路由实现。 依赖注入是一种强大的设计模式,能够显著提升代码质量。

    59910

    ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】

    本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们已经可以正确是使用这些与依赖注入相关的API了。...如果你还对这个依赖注入系统底层的实现原理具有好奇心,可以继续阅读这一节的内容。...是ASP.NET Core依赖注入系统的一个核心对象,但是默认的实现者是一个定义在程序集 “Microsoft.Extensions.DependencyInjection.dll” 中的一个名为 “ServiceProvider...” 内部(Internal)类型,而且它所依赖的很多接口和类型也是如此,所以我相信实现在这个ServiceProvider类中的服务提供机制对于绝大部分人是陌生的。...在这里需要特别说明的是我们重建的ServiceProvider以及其他重建的接口和类旨在体现真实ServiceProvider设计思想和实现原理,在具体的源代码层面是有差异的。

    90460

    走近微服务,第4部分:使用GoConvey进行测试和模拟

    在本博客系列的第4部分中,我们将一窥究竟。 在单元环境中测试微服务的主题 用GoConvey的BDD风格编写单元测试 引入模拟技术 由于这部分不会以任何方式改变核心服务,所以这次没有基准。...这就是说 - 我认为很多具体的微服务超出了传统单元测试的范畴,我们将在博客系列的这部分中处理这些内容。...集成组件如(用于与其他服务进行通信,发送消息,访问数据库等的)客户端,应该设计依赖注入,考虑可模拟性。...MockBoltClient 满足第3部分中定义的 IBoltClient 接口(功能). func (m *MockBoltClient) QueryAccount(accountId string)...如上所述,由于MockBoltClient结构具有与IBoltClient接口中声明的所有函数的签名相匹配的函数,因此此代码隐式实现了IBoltClient接口。

    3.6K40

    依赖注入:服务注册

    在《一个迷你版DI框架》中创建的Cat框架中的服务注册是通过类型ServiceRegistry表示的,在.NET Core依赖注入框架中,与之对应的类型是ServiceDescriptor。...考虑到服务注册是一个高频调用的操作,所以依赖注入框架为IServiceCollection接口定义了一系列扩展方法完成服务注册的工作,比如下面的这两个Add方法可以将指定的一个或者多个ServiceDescriptor...Core 3框架揭秘] 依赖注入[1]:控制反转 [ASP.NET Core 3框架揭秘] 依赖注入[2]:IoC模式 [ASP.NET Core 3框架揭秘] 依赖注入[3]:依赖注入模式 [ASP.NET...[ASP.NET Core 3框架揭秘] 依赖注入[7]:服务消费 [ASP.NET Core 3框架揭秘] 依赖注入[8]:服务实例的生命周期 [ASP.NET Core 3框架揭秘] 依赖注入[9...]:实现概述 [ASP.NET Core 3框架揭秘] 依赖注入[10]:与第三方依赖注入框架的适配

    1.4K30

    .NET Core下的日志(1):记录日志信息

    ”中)实现对日志的记录。....日志记录编程主要会涉及到三个核心对象,它们分别是Logger、LoggerFactory和LoggerProvider,这三个对象同时也是.NET Core日志模型中的核心对象,并通过相应的接口(ILogger...创建它们调用的构造函数具有一个Funcstring, LogLevel, bool>类型的参数旨在对日志消息进行写入前过滤(针对日子类型和等级),由于我们传入的委托对象总是返回True,意味着提供的所有日志均会被写入...在我们演示的实例中,我们直接调用构造函数创建了一个LoggerFactory并利用它来创建用于记录日志的Logger,在一个.NET Core应用中,LoggerFactory会以依赖注入的方式注册到...在.NET Framework 2.0种,增强的追踪日志功能实现在新引入的TraceSource类型中,并成为我们的首选。.

    1.5K70
    领券