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

【NetCore】05-使用Autofac增强容器能力

文章目录

    • 1.什么情况下需要引入第三方容器组件
    • 2.如何集成Autoface

1.什么情况下需要引入第三方容器组件

  • 基于名称的注入
  • 属性注入
  • 子容器
  • 基于动态代理的AOP

核心扩展点:IServiceProviderFactory

第三方注入容器均使用这个类作为扩展点,将其注入到框架中,所以使用者只需关注官方定义的接口,而不用过多关注第三方容器

// 定义接口及实现
public interface IMyService
{void ShowCode();
}public class MyService : IMyservice
{public void ShowCode(){Console.WriteLine($"MyService.ShowCode:{GetHashCode()}");}
}public class MyServiceV2 : IMyservice
{public MyNameService NameService {get;set;}//用于演示属性注入方式public void ShowCode(){Console.WriteLine($"MyServiceV2.ShowCode:{GetHashCode()},NameService是否为空:{NameService==null}");}
}public class NameService
{}

2.如何集成Autoface

step 1 安装依赖包
1.Autofac.Extensions.DependencyInjection ⇒ 依赖注入包
2.Autofac.Extras.DynamicProxy ⇒ 动态代理包

step 2 Program添加代码

public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).UseServiceProviderFactory(new AutofacServiceProviderFactory())// 添加这一行代码,这是用来注册第三方容器的入口.ConfigureWebHostDefaults(webBuilder => {webBuilder.UserStartup<Startip>();});

step 3 Startup添加方法ConfigureContainer

// 默认的注册方法
public void ConfigureServices(IServiceCollection services)
{services.AddControllers().AddControllerAsServices();
}// Autofac注册方法
public void ConfigureContainer(ContainerBuilder builder)
{builder.RegisterType<MyService>().As<IMyService>();// 命名注册,用于一个服务注册多次,并用命名来进行区分builder.RegisterType<MyServiceV2>().Named<IMyservice>("service2");// 属性注册builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired();// AOPbuilder.RegisterType<MyInterceptor>();// 拦截器//builder.RegisterType<MyNameService>();builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired().InterceptedBy(typeof(MyInterceptor)).EnableInterfaceInterceptors();// 子容器builder.RegisterType<MyNameService>().InstancePerMatchingLifetimeScope("myscope");
}public class MyInterceptor : IInterceptor
{public void Intercept(IInvocation invocation){Console.WriteLine($"拦截器前{invocation.Method.Name}");invocation.Processed();// 执行具体方法Console.WriteLine($"拦截器后{invocation.Method.Name}");}
}
http://www.lryc.cn/news/99724.html

相关文章:

  • sparksql参数
  • STM32读写内部Flash
  • golang文件锁,目录锁,syscall包的使用
  • 数据库数据恢复-Syabse数据库存储页底层数据杂乱的数据恢复案例
  • 移远通信推出新一代高算力智能模组SG885G-WF,为工业和消费级IoT应用带来全新性能标杆
  • 微信小程序开发,小程序类目符合,线上版本无权限申请wx.getLocation接口
  • vue2企业级项目(五)
  • 【HTML5】拖放详解及实现案例
  • Codeforces Round 888 (Div. 3)(视频讲解全部题目)
  • MySQL之深入InnoDB存储引擎——物理文件
  • Jquery操作html常用函数
  • 【Lua学习笔记】Lua进阶——Table,迭代器
  • 重庆市北斗新型智慧城市政府项目
  • FANUC机器人SRVO-217故障报警原因分析及参考解决办法
  • 统信UOS安装mysql数据库(mariadb)-统信UOS安装JDK-统信UOS安装nginx(附安装包)
  • 上门小程序开发|上门服务小程序|上门家政小程序开发
  • 1000道网络安全必备面试题合集,秋招金九银十必看!!!
  • 从0-1实现简易Raft分布式共识算法
  • Spring 创建和使用
  • Javadoc comment自动生成
  • vue3 +ts 报错 index.vue 不是模块
  • win10 hadoop报错 unable to load native-hadoop library
  • 前端(九)——探索微信小程序、Vue、React和Uniapp生命周期
  • MyBatis查询数据库(2)
  • Jenkins构建完成后发送消息至钉钉
  • 从浏览器输入url到页面加载(六)前端必须了解的路由器和光纤小知识
  • C语言假期作业 DAY 06
  • [nlp] tokenizer加速:fast_tokenizer=True
  • 基于OpenCV solvePnP函数估计头部姿势
  • STC12C5A系列单片机内部 EEPROM 的应用