当前位置: 首页 > news >正文

Web开发:ABP框架14——多个实现,一个接口的高端写法

一、方式一:环境变量决定实现

参考下面文章的 手动注入 ,不同环境变量的实现不一样,但是接口还是同一个。

其实这种方式下,若想切换实现,还是可以看方式二

Web开发:ABP框架8——仓储写法及其依赖注入的相关介绍_abp 中自动仓储需要安装哪些模块-CSDN博客

二、方式二:代码选择实现

【设计目标】

  • 有接口IntefaceService,实现有两个:AService、BService
  • 注入IntefaceService时,代码可选择实现谁
  • 注入IntefaceService时,代码若未选择,默认实现是AService

【实现方式】

1.两个实现一个接口

分别写在三个.cs中,下面是方便展示才这样写:

public class AService : IntefaceService ,ITransientDependency //实现接口IntefaceService ,且生命周期设置为瞬态
{public AService(){}public string Product(string productId){return $"Product from Service A with ID {productId}";}
}public class BService : IntefaceService, ITransientDependency //实现接口IntefaceService ,且生命周期设置为瞬态
{public string Product(string productId){return $"Product from Service B with ID {productId}";}
}public interface IntefaceService 
{public string Product(string productId);
}

2.高层服务接口

需要注入IntefaceService(抽象接口,有两个实现:AService、BService),注入IServiceProvider(框架自带,获取服务实现,类似于new一个类出来,即创建一个对象)

/// <summary>
/// 验证
/// </summary>
/// <returns></returns>
[Route("Check")]
[IgnoreAntiforgeryToken]
[HttpPost]
public async Task<string> Check(string db)
{var res = GetProductService(db).Product(Guid.NewGuid().ToString());var res2 = _intefaceService.Product(Guid.NewGuid().ToString());return res+"\n"+res2; //第一个参数由入参决定结果,第二个参数是默认实现的结果(我配置的默认实现是AService)
}    //简单的创建型模式工厂(根据字符串返回实现)
private IntefaceService GetProductService(string serviceType)
{return serviceType switch{"A" => _serviceProvider.GetService<AService>(),"B" => _serviceProvider.GetService<BService>(),_ => throw new ArgumentException("Invalid service type")};
}

3.公共模块配置依赖注入

一个接口,多个实现,依赖注入,必须明确一个默认的实现,否则会报错!下面这句代码至关重要。

//BookStoreApplicationModule.cs
public override void ConfigureServices(ServiceConfigurationContext context)
{context.Services.AddTransient<IntefaceService, AService>();  // 如果有多个实现,必须选择一个默认的实现
}

【输出效果】

        输入符合预期,上面这个随入参变化而变化,下面这个用的是依赖注入时的默认的实现

http://www.dtcms.com/a/410909.html

相关文章:

  • Springboot社区集市摆摊管理系统jv9kp(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 国产手机百花齐放,如何化解“选择困难症”?
  • 百度主机做视频网站怎么样淘宝客是以下哪个网站的会员简称
  • AI 算力加速指南
  • 【財運到】股票期货盯盘助手-自选股界面介绍
  • 架构入门系列:用数学公式估算服务器数量的实战指南
  • Redis02-Ehcache缓存
  • 结合 SSH 22 + 2222 备用端口 + 临时保护 + 长期守护 + 防火墙 的终极一行命令版本
  • 使用虚幻引擎时间轴制作一个弹跳小球
  • 网站推广和精准seo深圳网站设计兴田德润i简介
  • 从比分到直播流畅度:API 在体育观赛中的关键作用
  • JavaScript又忘了,忘了?太正常了!忘了?太正常了!重新上路:
  • 全新一代北斗三号短报文通信SoC芯片在北斗规模应用国际峰会发布
  • 佛山做企业网站的公司专业设计网站有哪些
  • 户用储能微型逆变器计量电表防逆流
  • 通过手动安装本地部署live-torrent (影视搜索,云播客户端)
  • 学做立体书的网站网站怎么做gps定位
  • 【实时Linux实战系列】实时系统的现场变更与灰度发布
  • 做个简单网站大概多少钱it培训机构排名北京
  • Spring Boot 自动配置之 TaskScheduler
  • .NET Framework 3.5官网下载与5种常见故障解决方法
  • nginx的访问控制、用户认证、https
  • 网站建设完整网站如何做图片特效
  • 服装类跟单系统:提升供应链管理效率的利器
  • 基于微信小程序的旅游景点系统【2026最新】
  • 网站建设升级网站开发项目架构
  • JxBrowser 7.44.0 版本发布啦!
  • Python 高效将 PDF 转换为 HTML 的实用指南
  • Ubuntu 24.04 LTS 安装GAMIT
  • 路由器设置网站做羞羞的事网站