翼度科技»论坛 编程开发 .net 查看内容

Autofac高级应用,一个接口多个实现类如何注册到容器并获取实例

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
 
当使用Autofac处理一个接口有多个实现的情况时,通常会使用键(key)进行区分或者通过IIndex索引注入,也可以通过IEnumerable集合获取所有实例,以下是一个具体的例子,演示如何在Autofac中注册多个实现,并通过构造函数注入获取指定实现。
首先,确保你已经安装了Autofac NuGet包:
  1. Install-Package Autofac
复制代码
然后,我们看一个示例:
  1. using System;
  2. using Autofac;
  3. // 定义接口
  4. public interface IService
  5. {
  6.     void Execute();
  7. }
  8. // 实现接口的两个类
  9. public class ServiceA : IService
  10. {
  11.     public void Execute()
  12.     {
  13.         Console.WriteLine("ServiceA is executing.");
  14.     }
  15. }
  16. public class ServiceB : IService
  17. {
  18.     public void Execute()
  19.     {
  20.         Console.WriteLine("ServiceB is executing.");
  21.     }
  22. }
  23. // 包含多个实现的类
  24. public class ServiceConsumer
  25. {
  26.     private readonly IService _service;
  27.     //KeyFilterc通过Keyed方法获取指定IService实现实例
  28.     //通过IIndex索引注入
  29.     //IEnumerable<IService>获取所有IService的实现实例
  30.     public ServiceConsumer(
  31.       [KeyFilter("ServiceA")] IService serviceA,//通过KeyFilter键注入
  32.       [KeyFilter("ServiceB")] IService serviceB,//通过KeyFilter键注入
  33.       IIndex<ServiceA, IService> serviceA1,//通过IIndex索引注入
  34.       IIndex<ServiceB, IService> serviceB1,//通过IIndex索引注入
  35.       IEnumerable<IService> services//注入全部实现
  36.     )
  37.     {
  38.         //根据实现选择进行选择赋值
  39.         _service=serviceA;
  40.         _service=serviceB;
  41.         _service=serviceA1;
  42.         _service=serviceB1;
  43.     }
  44.     public void UseService()
  45.     {
  46.         _service.Execute();
  47.     }
  48. }
  49. class Program
  50. {
  51.     static void Main()
  52.     {
  53.         // 创建 Autofac 容器构建器
  54.         var builder = new ContainerBuilder();
  55.         // 注册多个实现,使用 Keyed 注册方式
  56.         builder.RegisterType<ServiceA>().Keyed<IService>("ServiceA");
  57.         builder.RegisterType<ServiceB>().Keyed<IService>("ServiceB");
  58.         // 注册 ServiceConsumer 类
  59.         builder.RegisterType<ServiceConsumer>();
  60.         // 构建容器
  61.         var container = builder.Build();
  62.         // 通过构造函数注入获取指定实现
  63.         var serviceConsumer = container.Resolve<ServiceConsumer>();
  64.         serviceConsumer.UseService();
  65.     }
  66. }
复制代码
这个示例中:

  • 定义了 IService 接口和两个实现类 ServiceA 和 ServiceB。
  • 使用 Keyed 注册方式,为每个实现指定了一个键。
  • 创建了 ServiceConsumer 类,通过构造函数注入了 IService 实例,使用了 KeyFilter 特性指定了要注入的实现。
  • 注册 ServiceConsumer 类,Autofac 将自动解析构造函数,并注入指定的实现。
通过这样的方式,你可以在构造函数中注入指定键对应的实现,实现了一个接口有多个实现时的注册和获取。
 


来源:https://www.cnblogs.com/hanbing81868164/archive/2023/12/07/17880889.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具