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

公司网站建设设计公司哪家好电子版简历免费的

公司网站建设设计公司哪家好,电子版简历免费的,app上架应用市场需要什么条件,wordpress可以上传网页吗前言:接上一篇文章,有了微软官方的依赖注入组件Microsoft.Extensions.DependencyInjection, 那么今天介绍一个新的开源的依赖注入组件Autofac 一、二者的差异Autofac和微软官方的依赖注入组件(Microsoft.Extensions.DependencyIn…

前言:接上一篇文章,有了微软官方的依赖注入组件Microsoft.Extensions.DependencyInjection, 那么今天介绍一个新的开源的依赖注入组件Autofac

一、二者的差异Autofac和微软官方的依赖注入组件(Microsoft.Extensions.DependencyInjection,简称MSDI)在功能、灵活性和适用场景上存在显著差异。以下是两者的核心区别分析:

1. 功能扩展性

Autofac
①高级特性支持:提供属性注入([Inject])、方法注入基于元数据的注册(如Keyed/Named服务)、动态代理(AOP)等特性。

②模块化设计:通过Module类实现代码分组和配置复用,适合大型项目。

③生命周期管理:支持InstancePerDependency(瞬态)、SingleInstance(单例)、InstancePerLifetimeScope(作用域),并允许自定义生命周期。

④集成能力:可与第三方库(如ASP.NET Core、WPF、Unity等)深度集成,甚至替换MSDI为底层容器。

MSDI

①基础功能为主:仅支持构造函数注入和简单的生命周期(Transient、Scoped、Singleton)。
②轻量级设计:作为.NET Core内置组件,注重开箱即用,适合小型项目或快速原型开发。
与ASP.NET Core深度集成:作为框架默认容器,与中间件、配置系统无缝协作。

使用 Autofac 实现依赖注入

一、 基本依赖注入

首先,我们来看一个简单的依赖注入示例。假设我们有一个 IProductService 接口和一个 ProductService 类,以及一个 IProductRepository 接口和一个 ProductRepository 类。

定义类

public interface IProductService
{void SaveProduct();
}public interface IProductRepository
{void GetProduct();
}

类实现

public class ProductService : IProductService
{public IProductRepository productRepository { get; set; }public void SaveProduct(){productRepository?.GetProduct();Console.WriteLine("保存ProductService商品成功");}
}public class ProductRepository : IProductRepository
{public void GetProduct(){Console.WriteLine("获取商品成功");}
}

使用 Autofac 进行属性注入

在 Autofac 中,我们可以使用 PropertiesAutowired() 方法来实现属性注入。

using Autofac;
using System.Reflection;public class Program
{public static void Main(string[] args){// 1、创建ContainerBuilderContainerBuilder containerBuilder = new ContainerBuilder();// 1.1、注册具体类型和接口containerBuilder.RegisterType<ProductService>().As<IProductService>().PropertiesAutowired(); // 属性依赖注入containerBuilder.RegisterType<ProductRepository>().As<IProductRepository>(); // 注入具体类型接口// 2、构造容器var container = containerBuilder.Build();// 3、取对象using (var scope = container.BeginLifetimeScope()) // 设定范围{IProductService productService = scope.Resolve<IProductService>();productService.SaveProduct();}}
}

在这个示例中,ProductServiceproductRepository 属性会被自动注入 ProductRepository 的实例。

二、 批量注入

在实际项目中,手动注册每个类型可能会比较繁琐。我们可以使用 Autofac 的批量注入功能来简化这个过程。

接口定义

public interface IProductService
{void SaveProduct();
}public interface IOrderService
{void GetOrders();
}public interface IProductRepository
{void GetProduct();
}public interface IOrderRepository
{void GetOrders();
}

类实现

public class ProductService : IProductService
{public IProductRepository productRepository { get; set; }public void SaveProduct(){productRepository?.GetProduct();Console.WriteLine("保存ProductService商品成功");}
}public class OrderService : IOrderService
{public IOrderRepository orderRepository { get; set; }public void GetOrders(){orderRepository?.GetOrders();Console.WriteLine($"查询订单成功, ID: {this.GetHashCode()}");}
}public class ProductRepository : IProductRepository
{public void GetProduct(){Console.WriteLine("获取商品成功");}
}public class OrderRepository : IOrderRepository
{public void GetOrders(){Console.WriteLine("获取订单成功");}
}

使用 Autofac 进行批量注入

using Autofac;
using System.Reflection;public class Program
{public static void Main(string[] args){// 1、创建ContainerBuilderContainerBuilder containerBuilder = new ContainerBuilder();// 1.1、整个项目注册containerBuilder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) // 加载整个项目.AsImplementedInterfaces() // 只要有接口都实现注册.PropertiesAutowired(); // 开发属性依赖注入// 2、构造容器var container = containerBuilder.Build();// 3、取对象using (var scope = container.BeginLifetimeScope()){IProductService productService = scope.Resolve<IProductService>();productService.SaveProduct();IOrderService orderService = scope.Resolve<IOrderService>();orderService.GetOrders();}}
}

在这个示例中,Autofac 会自动扫描当前程序集中的所有类型,并将实现了接口的类注册为相应的接口。PropertiesAutowired() 方法会自动注入所有实现了接口的属性。

三、 基于特性的对象过滤

有时候,我们希望根据某些条件来注册特定的类型。我们可以使用特性(Attributes)来实现这一点。假设我们希望只注册那些带有 AutoRegisterAttribute 特性的类。

创建特性类

using System;[AttributeUsage(AttributeTargets.Class)]
public class AutoRegisterAttribute : Attribute
{
}

在类上添加特性

[AutoRegister]
public class ProductService : IProductService
{public IProductRepository productRepository { get; set; }public void SaveProduct(){productRepository?.GetProduct();Console.WriteLine("保存ProductService商品成功");}
}[AutoRegister]
public class OrderService : IOrderService
{public IOrderRepository orderRepository { get; set; }public void GetOrders(){orderRepository?.GetOrders();Console.WriteLine($"查询订单成功, ID: {this.GetHashCode()}");}
}public class ProductRepository : IProductRepository
{public void GetProduct(){Console.WriteLine("获取商品成功");}
}public class OrderRepository : IOrderRepository
{public void GetOrders(){Console.WriteLine("获取订单成功");}
}

使用 Autofac 进行基于特性的对象过滤

using Autofac;
using System.Reflection;public class Program
{public static void Main(string[] args){// 1、创建ContainerBuilderContainerBuilder containerBuilder = new ContainerBuilder();// 1.1、整个项目注册containerBuilder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) // 加载整个项目.Where(t => t.GetCustomAttributes(typeof(AutoRegisterAttribute), false).Length > 0) // 通过特性过滤.AsImplementedInterfaces() // 只要有接口都实现注册.PropertiesAutowired(); // 开发属性依赖注入// 1.2、注册具体类型接口containerBuilder.RegisterType<ProductRepository>().As<IProductRepository>(); // 注入具体类型接口containerBuilder.RegisterType<OrderRepository>().As<IOrderRepository>(); // 注入具体类型接口// 2、构造容器var container = containerBuilder.Build();// 3、取对象using (var scope = container.BeginLifetimeScope()){IProductService productService = scope.Resolve<IProductService>();productService.SaveProduct();IOrderService orderService = scope.Resolve<IOrderService>();orderService.GetOrders();}}
}

在这个示例中,Where(t => t.GetCustomAttributes(typeof(AutoRegisterAttribute), false).Length > 0) 方法会过滤出所有带有 AutoRegisterAttribute 特性的类,并将它们注册到容器中。

四、 基于方法特性的对象过滤

如果你希望根据方法上的特性来过滤类,可以稍微修改一下我们的配置。假设我们希望只注册那些带有 AutoRegisterMethodAttribute 特性方法的类。

创建特性类

using System;[AttributeUsage(AttributeTargets.Method)]
public class AutoRegisterMethodAttribute : Attribute
{
}

在方法上添加特性

public interface IProductService
{void SaveProduct();
}public interface IOrderService
{void GetOrders();
}public interface IProductRepository
{void GetProduct();
}public interface IOrderRepository
{void GetOrders();
}public class ProductService : IProductService
{public IProductRepository productRepository { get; set; }public void SaveProduct(){productRepository?.GetProduct();Console.WriteLine("保存ProductService商品成功");}
}public class OrderService : IOrderService
{public IOrderRepository orderRepository { get; set; }[AutoRegisterMethod]public void GetOrders(){orderRepository?.GetOrders();Console.WriteLine($"查询订单成功, ID: {this.GetHashCode()}");}
}public class ProductRepository : IProductRepository
{public void GetProduct(){Console.WriteLine("获取商品成功");}
}public class OrderRepository : IOrderRepository
{public void GetOrders(){Console.WriteLine("获取订单成功");}
}

使用 Autofac 进行基于方法特性的对象过滤

using Autofac;
using System.Reflection;public class Program
{public static void Main(string[] args){// 1、创建ContainerBuilderContainerBuilder containerBuilder = new ContainerBuilder();// 1.1、基于方法特性注册containerBuilder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) // 加载整个项目.Where(t => t.GetMethods().Any(m => m.GetCustomAttributes(typeof(AutoRegisterMethodAttribute), false).Length > 0)).AsImplementedInterfaces() // 只要有接口都实现注册.PropertiesAutowired(); // 开发属性依赖注入// 1.2、注册具体类型接口containerBuilder.RegisterType<ProductRepository>().As<IProductRepository>(); // 注入具体类型接口containerBuilder.RegisterType<OrderRepository>().As<IOrderRepository>(); // 注入具体类型接口// 2、构造容器var container = containerBuilder.Build();// 3、取对象using (var scope = container.BeginLifetimeScope()){// IProductService productService = scope.Resolve<IProductService>();// productService.SaveProduct();IOrderService orderService = scope.Resolve<IOrderService>();orderService.GetOrders();}}
}

在这个示例中,Where(t => t.GetMethods().Any(m => m.GetCustomAttributes(typeof(AutoRegisterMethodAttribute), false).Length > 0)) 方法会过滤出所有包含带有 AutoRegisterMethodAttribute 特性方法的类,并将它们注册到容器中。

总结

通过本文,学习了如何使用 Autofac 实现依赖注入,包括:

属性注入:使用 PropertiesAutowired() 方法自动注入属性。
批量注入:使用 RegisterAssemblyTypes() 方法自动注册程序集中的所有类型。
基于特性的对象过滤:通过自定义特性类和 GetCustomAttributes() 方法来过滤需要注册的类。
Autofac 提供了灵活的配置选项,可以根据具体需求选择合适的注入方式。

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

相关文章:

  • 库存网站建设定制二学一做网站
  • 魔方网站建设辽宁建设工程信息网老网站
  • 绍兴网站建设报价做微商如何引流推广怎么找客源
  • php和html5做网站国外网站素材
  • 南宁著名的网站如何做自己的游戏网站
  • 卢沟桥网站建设事件营销的方法
  • 做电商搜素材网站都是什么汾阳网架公司
  • 免建网站互联网运营
  • 海南房产网站开发网页制作和网页制作设计
  • 信息推广网站点不开的那种怎么做个人建站免费服务器
  • 英文网站建设怎么样做能支付的网站贵吗
  • 58网站 做现浇混凝土微博手机网页版入口
  • 外卖网站建设方案书个人主页怎么申请
  • 深圳做企业网站沈阳建设工程管理中心
  • 巩义移动网站建设网站服务器拒绝连接
  • 网站建设 免费视频网站怎么添加关键词 好让百度收入_ 现在网站用的是模板做的
  • termsrv!InitializeSystemTrace函数分析开启调试TraceEnable和TraceClass和TraceDebugger
  • 网站建设合同百度文库wordpress 计划表格
  • 公司域名注册网站哪个好网站建设需求分析流程图
  • FTP 概念及题目
  • 如手机网站源码软件开发专业好吗
  • 公司网站建设会计分录西安wordpress开发
  • 如何建立公司网站模块校园网络及网站建设
  • 手游网站开发客户管理系统的功能
  • 网站建设 银川南京广告公司排名前十
  • 彩票网站建设维护wordpress数据库出错
  • 网站建站的步骤网络服务平台标书
  • 自学网站建设多久wordpress 开源协议
  • 英文自助建站贸易公司网站建设方案
  • 无法访问服务器上网站seo基础培训教程