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

做网站需要具备哪些条件邯郸网站建设

做网站需要具备哪些条件,邯郸网站建设,四网合一的网站,网站分为四个步骤开发建设目录 .NET IoC 容器#xff08;三#xff09;AutofacAutofacNuget 安装实现DI定义接口定义实现类依赖注入 注入方式构造函数注入 | 属性注入 | 方法注入注入实现 接口注册重复注册指定参数注册 生命周期默认生命周期单例生命周期每个周期范围一个生命周期 依赖配置Nuget配置文… 目录 .NET IoC 容器三AutofacAutofacNuget 安装实现DI定义接口定义实现类依赖注入 注入方式构造函数注入 | 属性注入 | 方法注入注入实现 接口注册重复注册指定参数注册 生命周期默认生命周期单例生命周期每个周期范围一个生命周期 依赖配置Nuget配置文件 AOPNuget安装定义接口、实现类定义切面容器配置 参考资料 .NET IoC 容器三Autofac Autofac Autofac 是一个用于 .NET 应用程序的依赖注入 (Dependency Injection, DI) 容器。它帮助开发人员管理对象的创建和生命周期使得依赖项的注入更加灵活和可维护。以下是 Autofac 的主要功能和特性概述 依赖注入 (Dependency Injection) Autofac 允许你通过构造函数、属性或方法注入依赖项。这样你可以轻松地将对象的依赖关系传递给需要它们的类从而提高代码的可测试性和可维护性。 模块化设计 (Modular Design) Autofac 支持模块化设计可以将相关的依赖项注册逻辑分组到模块中。这使得大型应用程序的配置更加简洁和易于管理。 生命周期管理 (Lifecycle Management) Autofac 提供多种对象生命周期管理方式例如单例 (Singleton)、每次请求 (Instance Per Dependency)、每个生命周期范围 (Instance Per Lifetime Scope) 等允许你精确控制对象的创建和销毁时机。 注册与解析 (Registration and Resolution) Autofac 通过流畅的 API 提供了多种注册组件的方式。你可以注册类型、实例、工厂方法甚至通过扫描程序集自动注册组件。此外Autofac 的解析功能支持构造函数参数注入、命名参数注入等高级特性。 支持 AOP (Aspect-Oriented Programming) Autofac 与 AOP 框架如 Castle Windsor集成支持横切关注点如日志记录、事务管理的处理从而使业务逻辑代码更加简洁。 集成支持 Autofac 与许多流行的 .NET 库和框架集成良好包括 ASP.NET Core、WCF、Web API、MVC 等。通过这些集成Autofac 可以轻松地管理 web 应用程序中的依赖项。 扩展性 Autofac 具有很高的扩展性可以通过自定义注册源、生命周期、解析器等方式扩展其功能以满足特定应用的需求。 Nuget 安装 实现DI 定义接口 internal interface IComputer { }internal interface IKeyboard { }internal interface IMouse { }internal interface IPerson {IComputer Computer { get; set; }IKeyboard Keyboard { get; set; }IMouse Mouse { get; set; }void Work(); }定义实现类 internal class ConstructBase {public ConstructBase() {Console.WriteLine(${this.GetType().Name} - 被构造了);} }internal class LenovoComputer : ConstructBase, IComputer {public LenovoComputer() : base() { } }internal class TogarKeyboard : ConstructBase, IKeyboard {public TogarKeyboard() : base() { } }internal class LogitechMouse : ConstructBase, IMouse {public LogitechMouse() : base() { } }internal class Programmer : ConstructBase, IPerson {public IComputer Computer { get; set; }public IKeyboard Keyboard { get; set; }public IMouse Mouse { get; set; }public Programmer(IComputer computer, IKeyboard keyboard, IMouse mouse) : base(){Computer computer;Keyboard keyboard;Mouse mouse;}public void Work(){Console.WriteLine(Programmers are building software...);} }依赖注入 var builder new ContainerBuilder(); builder.RegisterTypeLenovoComputer().AsIComputer(); builder.RegisterTypeTogarKeyboard().AsIKeyboard(); builder.RegisterTypeLogitechMouse().AsIMouse(); builder.RegisterTypeProgrammer().AsIPerson(); var container builder.Build(); IPerson programmer container.ResolveIPerson(); programmer.Work();输出 Zhy.IoC.Autofac.LenovoComputer - 被构造了 Zhy.IoC.Autofac.TogarKeyboard - 被构造了 Zhy.IoC.Autofac.LogitechMouse - 被构造了 Zhy.IoC.Autofac.Programmer - 被构造了 Programmers are building software...注入方式 构造函数注入 | 属性注入 | 方法注入 定义特性用来筛选属性注入 public class InjectPropertyAttribute : Attribute {}定义实现类 public class Gamer : ConstructBase, IPerson {public IComputer Computer { get; set; }[InjectProperty]public IKeyboard Keyboard { get; set; }public IMouse Mouse { get; set; }public Gamer(IComputer computer) : base(){Computer computer;}public void Inject(IMouse mouse){Mouse mouse;}public void Work(){Console.WriteLine(The player is playing...);} }注入实现 // 注入顺序与编码顺序无关构造函数注入 属性注入 方法注入 var builder new ContainerBuilder(); builder.RegisterTypeLenovoComputer().AsIComputer(); builder.RegisterTypeTogarKeyboard().AsIKeyboard(); builder.RegisterTypeLogitechMouse().AsIMouse(); builder.RegisterTypeGamer()// 方法注入.OnActivating(e {IMouse mouse e.Context.ResolveIMouse();e.Instance.Inject(mouse);})// 属性注入.PropertiesAutowired((g, o) g.Name Keyboard)// 构造函数注入.UsingConstructor(typeof(IComputer)).AsIPerson(); var container builder.Build(); IPerson gamer container.ResolveIPerson(); gamer.Work();输出 Zhy.IoC.Autofac.LenovoComputer - 被构造了 Zhy.IoC.Autofac.Gamer - 被构造了 Zhy.IoC.Autofac.TogarKeyboard - 被构造了 Zhy.IoC.Autofac.LogitechMouse - 被构造了 The player is playing...结果 注入顺序构造函数注入 属性注入 方法注入 接口注册 重复注册 var builder new ContainerBuilder(); builder.RegisterTypeLenovoComputer().AsIComputer(); builder.RegisterTypeTogarKeyboard().AsIKeyboard(); builder.RegisterTypeLogitechMouse().AsIMouse(); builder.RegisterTypeProgrammer().AsIPerson(); builder.RegisterTypeGamer()// 方法注入.OnActivating(e {IMouse mouse e.Context.ResolveIMouse();e.Instance.Inject(mouse);})// 属性注入.PropertiesAutowired((g, o) g.Name Keyboard)// 构造函数注入.UsingConstructor(typeof(IComputer)).AsIPerson(); var container builder.Build(); IPerson programmer container.ResolveIPerson(); programmer.Work();输出 Zhy.IoC.Autofac.LenovoComputer - 被构造了 Zhy.IoC.Autofac.Gamer - 被构造了 Zhy.IoC.Autofac.TogarKeyboard - 被构造了 Zhy.IoC.Autofac.LogitechMouse - 被构造了 The player is playing...调换Gamer和Programmer的注册顺序 var builder new ContainerBuilder(); builder.RegisterTypeLenovoComputer().AsIComputer(); builder.RegisterTypeTogarKeyboard().AsIKeyboard(); builder.RegisterTypeLogitechMouse().AsIMouse(); builder.RegisterTypeGamer()// 方法注入.OnActivating(e {IMouse mouse e.Context.ResolveIMouse();e.Instance.Inject(mouse);})// 属性注入.PropertiesAutowired((g, o) g.Name Keyboard)// 构造函数注入.UsingConstructor(typeof(IComputer)).AsIPerson(); builder.RegisterTypeProgrammer().AsIPerson(); var container builder.Build(); IPerson programmer container.ResolveIPerson(); programmer.Work();输出 Zhy.IoC.Autofac.LenovoComputer - 被构造了 Zhy.IoC.Autofac.TogarKeyboard - 被构造了 Zhy.IoC.Autofac.LogitechMouse - 被构造了 Zhy.IoC.Autofac.Programmer - 被构造了 Programmers are building software...结论 同一接口多次注册时后注册的会覆盖前面注册的若需要实现多重注册需要指定名称 var builder new ContainerBuilder(); builder.RegisterTypeLenovoComputer().AsIComputer(); builder.RegisterTypeTogarKeyboard().AsIKeyboard(); builder.RegisterTypeLogitechMouse().AsIMouse(); builder.RegisterTypeGamer()// 方法注入.OnActivating(e {IMouse mouse e.Context.ResolveIMouse();e.Instance.Inject(mouse);})// 属性注入.PropertiesAutowired((g, o) g.Name Keyboard)// 构造函数注入.UsingConstructor(typeof(IComputer)).NamedIPerson(person); builder.RegisterTypeProgrammer().NamedIPerson(programmer); var container builder.Build(); IPerson programmer container.ResolveNamedIPerson(programmer); IPerson person container.ResolveNamedIPerson(person); programmer.Work(); person.Work();输出 Zhy.IoC.Autofac.LenovoComputer - 被构造了 Zhy.IoC.Autofac.TogarKeyboard - 被构造了 Zhy.IoC.Autofac.LogitechMouse - 被构造了 Zhy.IoC.Autofac.Programmer - 被构造了 Zhy.IoC.Autofac.LenovoComputer - 被构造了 Zhy.IoC.Autofac.Gamer - 被构造了 Zhy.IoC.Autofac.TogarKeyboard - 被构造了 Zhy.IoC.Autofac.LogitechMouse - 被构造了 Programmers are building software... The player is playing...指定参数注册 修改接口 internal interface IMouse {string Type { get; set; } }修改实现类 internal class LogitechMouse : ConstructBase, IMouse {public LogitechMouse() : base() { }public LogitechMouse(string type) : base(){Type type;}public string Type { get; set; } }注入 var builder new ContainerBuilder(); builder.RegisterTypeLogitechMouse().WithParameter(type,502).AsIMouse(); var container builder.Build(); IMouse mouse container.ResolveIMouse(); Console.WriteLine(mouse type: mouse.Type);输出 Zhy.IoC.Autofac.LogitechMouse - 被构造了 mouse type: 502生命周期 Instance Per Dependency默认 每次请求组件时都会创建一个新的实例。这是默认的生命周期管理模式。 builder.RegisterTypeMyService().AsIMyService();Singleton 在整个容器生命周期内只有一个实例。 builder.RegisterTypeMyService().AsIMyService().SingleInstance();Instance Per Lifetime Scope 在每个生命周期范围内共享一个实例。每个生命周期范围都会创建一个新的实例但在该范围内共享该实例。 builder.RegisterTypeMyService().AsIMyService().InstancePerLifetimeScope();Instance Per Matching Lifetime Scope 在特定的生命周期范围内共享实例需要指定标记。 builder.RegisterTypeMyService().AsIMyService().InstancePerMatchingLifetimeScope(my-scope);Instance Per Request 通常用于 web 应用程序在每个 HTTP 请求期间共享一个实例。 builder.RegisterTypeMyService().AsIMyService().InstancePerRequest();Externally Owned 组件由外部代码管理生命周期Autofac 不会在容器释放时释放该实例。 builder.RegisterTypeMyService().AsIMyService().ExternallyOwned();Instance Per Dependency 每次依赖请求时都会创建一个新实例。 builder.RegisterTypeMyService().AsIMyService().InstancePerDependency();默认生命周期 var builder new ContainerBuilder(); builder.RegisterTypeLenovoComputer().AsIComputer(); var container builder.Build(); IComputer computer0 container.ResolveIComputer(); IComputer computer1 container.ResolveIComputer(); Console.WriteLine(computer0: computer0.GetHashCode()); Console.WriteLine(computer1: computer1.GetHashCode()); Console.WriteLine($computer0 computer1: {computer0 computer1});输出 Zhy.IoC.Autofac.LenovoComputer - 被构造了 Zhy.IoC.Autofac.LenovoComputer - 被构造了 computer0: 32347029 computer1: 22687807 computer0 computer1: False单例生命周期 var builder new ContainerBuilder(); builder.RegisterTypeLenovoComputer().AsIComputer().SingleInstance(); var container builder.Build(); IComputer computer0 container.ResolveIComputer(); IComputer computer1 container.ResolveIComputer(); Console.WriteLine(computer0: computer0.GetHashCode()); Console.WriteLine(computer1: computer1.GetHashCode()); Console.WriteLine($computer0 computer1: {computer0 computer1});输出 Zhy.IoC.Autofac.LenovoComputer - 被构造了 computer0: 32347029 computer1: 32347029 computer0 computer1: True每个周期范围一个生命周期 var builder new ContainerBuilder(); builder.RegisterTypeLenovoComputer().AsIComputer().InstancePerLifetimeScope(); var container builder.Build(); IComputer computer0 container.ResolveIComputer(); using (var scope container.BeginLifetimeScope()) {IComputer computer1 scope.ResolveIComputer();IComputer computer2 scope.ResolveIComputer();Console.WriteLine(computer0: computer0.GetHashCode());Console.WriteLine(computer1: computer1.GetHashCode());Console.WriteLine(computer2: computer2.GetHashCode());Console.WriteLine($computer0 computer1: {computer0 computer1});Console.WriteLine($computer1 computer2: {computer1 computer2}); }输出 Zhy.IoC.Autofac.LenovoComputer - 被构造了 Zhy.IoC.Autofac.LenovoComputer - 被构造了 computer0: 32347029 computer1: 22687807 computer2: 22687807 computer0 computer1: False computer1 computer2: True依赖配置 Nuget 配置文件 Json {components: [{type: Zhy.IoC.Autofac.LenovoComputer,Zhy.IoC.Autofac,services: [{type: Zhy.IoC.Core.IComputer,Zhy.IoC.Core}],autoActivate: true,instanceScope: singleinstance},{type: Zhy.IoC.Autofac.TogarKeyboard,Zhy.IoC.Autofac,services: [{type: Zhy.IoC.Core.IKeyboard,Zhy.IoC.Core}],autoActivate: true,instanceScope: singleinstance},{type: Zhy.IoC.Autofac.LogitechMouse,Zhy.IoC.Autofac,services: [{type: Zhy.IoC.Core.IMouse,Zhy.IoC.Core}],parameters: {places: 4},autoActivate: true,instanceScope: singleinstance},{type: Zhy.IoC.Autofac.Programmer,Zhy.IoC.Autofac,services: [{type: Zhy.IoC.Core.IPerson,Zhy.IoC.Core}],autoActivate: true,instanceScope: singleinstance}] }XML ?xml version1.0 encodingutf-8 ? autofaccomponents name0typeZhy.IoC.Autofac.LenovoComputer,Zhy.IoC.Autofac/typeservices name0 typeZhy.IoC.Core.IComputer,Zhy.IoC.Core //componentscomponents name1typeZhy.IoC.Autofac.TogarKeyboard,Zhy.IoC.Autofac/typeservices name0 typeZhy.IoC.Core.IKeyboard,Zhy.IoC.Core //componentscomponents name2typeZhy.IoC.Autofac.LogitechMouse,Zhy.IoC.Autofac/typeservices name0 typeZhy.IoC.Core.IMouse,Zhy.IoC.Core //componentscomponents name3typeZhy.IoC.Autofac.Programmer,Zhy.IoC.Autofac/typeservices name0 typeZhy.IoC.Core.IPerson,Zhy.IoC.Core //components /autofac调用 var config new ConfigurationBuilder(); config.AddJsonFile(DI-Autofac.json); // config.AddXmlFile(DI-Autofac.xml); var module new ConfigurationModule(config.Build()); var builder new ContainerBuilder(); builder.RegisterModule(module); var container builder.Build(); IPerson programmer container.ResolveIPerson(); programmer.Work();输出 Zhy.IoC.Autofac.LenovoComputer - 被构造了 Zhy.IoC.Autofac.TogarKeyboard - 被构造了 Zhy.IoC.Autofac.LogitechMouse - 被构造了 Zhy.IoC.Autofac.Programmer - 被构造了 Programmers are building software...AOP Nuget安装 定义接口、实现类 public interface IMyService {void DoWork(); }public void DoWork() {Console.WriteLine(Doing work...); }定义切面 using Castle.DynamicProxy;public class LoggingInterceptor : IInterceptor {public void Intercept(IInvocation invocation){Console.WriteLine($Invoking method {invocation.Method.Name} at {DateTime.Now});invocation.Proceed();Console.WriteLine($Method {invocation.Method.Name} has completed at {DateTime.Now});} }容器配置 var builder new ContainerBuilder(); builder.Register(c new LoggingInterceptor()); builder.RegisterTypeMyService().AsIMyService().EnableInterfaceInterceptors().InterceptedBy(typeof(LoggingInterceptor)); var container builder.Build(); var service container.ResolveIMyService(); service.DoWork();输出 Invoking method DoWork at 2024/5/30 16:49:34 Doing work... Method DoWork has completed at 2024/5/30 16:49:34参考资料 IOC容器之Unity与AutoFac_unity autofac-CSDN博客 Autofac/src/Autofac at develop · autofac/Autofac (github.com) 控制容器的反转和依赖关系注入模式 (martinfowler.com)
http://www.dnsts.com.cn/news/216576.html

相关文章:

  • 网站前台可以打开wordpress 后台实现轮播图
  • 张店网站建设价格wordpress如何导入附件
  • 如何自己创建网站wordpress免插件
  • 园林景观设计案例网站企业网站管理系统站长之家
  • 新能源网站建设哪家好东莞有什么好厂
  • 教育网站建设的策划方案如何做网站吸引广告商
  • 专业seo站长工具asp 网站源码 下载
  • 绍兴网站制作企业久治县wap网站建设公司
  • 江苏智能网站建设流程页面设计费用
  • 网站建设程序员做什么南昌seo网站管理
  • 网站建设工作总结6wordpress搭建电子商务
  • 网站搜索引擎优化方法自动发布到wordpress
  • 游戏网站建设项目规划爱站网使用体验
  • 建网站的论坛公众平台 wordpress
  • 网站设计怎么做一点首页就跳转绍兴公司注册
  • 爱站工具包如何增加网站wordpress 特别慢Mac
  • 国外花型设计网站ie不支持wordpress
  • 做视频网站都需要什么软件下载佛山网站策划哪家专业
  • 手机网站分享代码建设网站的注意事项
  • 中旅远洋商务网站建设策划书wordpress密码文件夹
  • 自己怎样优化网站360免费建站官网
  • 精致网站赏析网站开发 放大图片
  • 网站建设兼职在哪找有什么在线做文档的网站
  • 建设银行么官方网站软件开发需要用什么软件
  • 蓬业东莞网站建设技术支持网站托管服务商
  • 做网站公司的前景wordpress大前端美化版
  • 亦庄网站建设价格做的网站一直刷新
  • 成功的营销型网站设计特点百度推广登录地址
  • 网站图标 psd虚拟网站php专业型
  • 网站国际化怎么做网站介绍词