首页 > 其他分享 >一套接口多实现

一套接口多实现

时间:2023-10-22 22:26:27浏览次数:33  
标签:__ 实现 接口 private 一套 IMultiInterface public

.Net 一套接口多实现

 

.Net 一套接口多实现

接口(interface)可理解为规范、标准、协议。接口是用来约束各方都在同一组规范下工作。

电脑外设USB接口,各个品牌商家生产的U盘、鼠标都能够被电脑主板识别并工作,这是因为个生产商都遵循实现了USB接口协议。

在编程中接口应用非常广泛,例如IDbConnection接口,这是一组数据库连接的接口,由各个数据库驱动实现,因此.Net可以操作多种数据库。

一套接口多实现的基本结构如下

image

实现思路是,通过在各实现类上使用Attribute进行标记,然后定义一个实例获取类,通过反射获取所有实现该接口并且标记了的实现类,并将各个实现类通过IOC注册,然后通过标记的类型获取对应的实现类。

接下来是demo演示

定义服务标记

  [AttributeUsageAttribute(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
  public class MultiServiceTypeAttribute : Attribute
  {
  public string ServiceType { get; private set; }
  public MultiServiceTypeAttribute(string serviceType)
  {
  ServiceType = serviceType;
  }
  }

定义接口IMultiInterface

  public interface IMultiInterface
  {
  void Do();
  }

定义实现类AMultiInterfaceImplA并标记

  [MultiServiceTypeAttribute("A")]
  public class MultiInterfaceImplA : IMultiInterface
  {
  public void Do()
  {
  Console.WriteLine("这是A实现的调用");
  }
  }

定义实现类BMultiInterfaceImplB并标记

  [MultiServiceTypeAttribute("B")]
  public class MultiInterfaceImplB : IMultiInterface
  {
  public void Do()
  {
  Console.WriteLine("这是B实现的调用");
  }
  }

将接口与实现添加到IOC容器,这里使用 Microsoft.Extensions.DependencyInjection.dllMicrosoft.Extensions.DependencyInjection.Abstractions.dll两个库来实现简易IOC容器

  public class ServiceLoader
  {
  private readonly ServiceCollection __ioc = new ServiceCollection();
  private ServiceProvider __iocServiceProvider;
  private static object _lock = new object();
   
  private static ServiceLoader _inst;
   
  public static ServiceLoader Inst
  {
  get
  {
  if (_inst == null)
  {
  lock (_lock)
  {
  if (_inst == null)
  {
  _inst = new ServiceLoader();
  _inst.Init();
  }
  }
  }
  return _inst;
  }
  }
   
  private void Init()
  {
  var tps = typeof(IMultiInterface).Assembly.GetTypes().Where(x =>
  x.GetInterfaces().Any(_ => _.Name == nameof(IMultiInterface)));
  foreach (var item in tps)
  {
  if (item.IsClass)
  {
  Inst.AddTransient(typeof(IMultiInterface), item);
  }
  }
  Interlocked.Exchange(ref __iocServiceProvider, Inst.__ioc.BuildServiceProvider());
  }
   
  private void AddTransient(Type iface, Type impl)
  {
  __ioc.AddTransient(iface, impl);
  }
  }

根据标记的类型获取对应的接口实现。在ServiceLoader中继续添加以下方法

  public IMultiInterface GetService(string serviceType)
  {
  var svcList = __iocServiceProvider.GetServices<IMultiInterface>();
  var svc = svcList.FirstOrDefault(x => x.GetType().GetCustomAttribute<MultiServiceTypeAttribute>()?.ServiceType == serviceType);
  if (svc == null)
  {
  //Console.WriteLine($@"未找到 {serviceType} 服务实现,使用默认实现");
  // 如果有默认实现类,这里可选择调用默认实现
  //svc = svcList.FirstOrDefault(x => x.GetType().GetCustomAttribute<MultiServiceTypeAttribute>()?.ServiceType == "__default__");
  throw new Exception($"未找到 {serviceType} 服务实现");
  }
   
  return svc;
  }

通过ServiceLoader.Inst.GetService("serviceType").Do();来获取对应的接口实例,入参就是各个实现类上标记的类型,并调用接口。

调用示例如下

image

至此实现了一接口多实现的雏形。

标签:__,实现,接口,private,一套,IMultiInterface,public
From: https://www.cnblogs.com/Leo_wl/p/17781267.html

相关文章

  • 《信息安全系统设计与实现》第七周学习笔记
      第三章Unix/Linux进程管理多任务处理指的是同时进行几项独立活动的能力逻辑并行性称为“并发”进程进程是对映像的执行next是指向下一个PROC结构体的指针ksp保存的堆栈指针pid是一个进程的进程编号status是当前状态priority是进程调度优先级kstack是进程执行时......
  • 微机原理与接口技术-第七章输入输出接口
    目录I/O接口概述I/O接口的典型结构基本功能I/O端口的编址独立编址统一编址输入输出指令I/O寻址方式I/O数据传输量I/O保护16位DOS应用程序DOS平台的源程序框架DOS功能调用无条件传送和查询传送无条件传送三态缓冲器锁存器接口电路I/O接口概述I/O接口的典型结构内部结构I/O接口......
  • 20211316郭佳昊 《信息安全系统设计与实现(上)》 第七周学习总结
    一、任务要求[1]知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题核心是要求GPT:请你以苏格拉底的方式对我进行提问然后GPT就会......
  • 《信息安全系统设计与实现》第七周学习笔记
    一、课程内容第十一章学习1、多任务处理指的是同时进行几项独立活动的能力逻辑并行性称为“并发”2、进程操作系统是一个多任务处系统在操作系统中,任务也称为进程。在第2章中,我们把执行映像定义为包含执行代码、数据和堆栈的存储区。定义一个PROC结构体:next:指向下一个P......
  • 信息安全系统设计与实现第四章学习笔记
    一、知识点归纳1.并发计算导论在早期,大多数计算机只有一个处理组件,称为处理器或中央处理器(CPU)。受这种硬件条件的限制,计算机程序通常是为串行计算编写的。要求解某个问题,先要设计一种算法,描述如何一步步地解决问题,然后用计算机程序以串行指令流的形式实现该算法。在只有一个CPU......
  • 赋能传统行业:某企业通过监控易实现运维升级的故事
      在数字化转型浪潮中,众多传统行业面临着诸多挑战与机遇。如何通过现代化技术提升运维效能,成为了推动企业数字化进程的关键环节。在这片文章中,我们将探讨某企业如何通过引入监控易,实现运维的升级与转型。传统运维的挑战  某企业(以下简称“该企业”)作为一家拥有几十年历史的......
  • 信息安全系统设计与实现学习笔记6
    自学笔记6-重点总结1.Unix/Linux进程管理进程是对映像的执行。进程的产生是通过执行一个程序或指令,将程序加载到内存中成为一个独立的实体,并分配一个唯一的PID。子进程与父进程的关系:在bash中再调用bash时,会形成父子关系。注意要正确处理父进程生成子进程后的情况。......
  • 基于STM32的物联网节点设计与实现-传感器数据采集与无线通信
    基于STM32微控制器的物联网(IoT)节点的设计和实现。我们讨论物联网节点的基本概念和功能,并详细介绍了STM32微控制器的特点和优势。然后,我们将探讨如何使用STM32开发环境和相关的硬件模块来设计和实现一个完整的物联网节点。最后,我们将提供一个示例代码,展示如何在STM32上实现基本的传......
  • Dubbo快速入门_在本工程模块中依赖另外子模块的接口报错java找不到符号
    场景:Dubbo入门案例项目结构:三个子模块dubbodemo_interfacedubbodemo_providerdubbodemo_consumer在消费者和提供者中引入dubbodemo_interface的依赖。dubbodemo_interface中定义了一个接口HelloServicedubbodemo_provider中有HelloService的实现类dubbodemo_consumer中定......
  • 如何使用MyBatis-Plus实现字段的自动填充?一文教会你
    环境说明:Windows10+Idea2021.3.2+Jdk1.8+SpringBoot2.3.1.RELEASE前言在实际的开发过程中,我们经常需要在进行数据库操作时自动填充某些字段值,比如创建时间,更新时间等。手动填充虽然可行,但是容易出错,并且代码冗余,影响开发效率。MyBatis-Plus提供了字段自动填充的功能,可以......