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

网站与云平台区别手机开发小程序

网站与云平台区别,手机开发小程序,山西省建设厅执业资格注册中心网站,网络培训的心得体会文章目录 一、依赖注入核心原理1. 控制反转(IoC)与DI关系2. .NET DI核心组件 二、服务生命周期1. 三种生命周期类型 三、DI容器实现原理1. 服务注册流程2. 服务解析流程 四、高级实现方法1. 工厂模式注册2. 泛型服务注册3. 多实现解决方案 五、ASP.NET Core中的DI集成1. 控制器…

在这里插入图片描述

文章目录

    • 一、依赖注入核心原理
      • 1. 控制反转(IoC)与DI关系
      • 2. .NET DI核心组件
    • 二、服务生命周期
      • 1. 三种生命周期类型
    • 三、DI容器实现原理
      • 1. 服务注册流程
      • 2. 服务解析流程
    • 四、高级实现方法
      • 1. 工厂模式注册
      • 2. 泛型服务注册
      • 3. 多实现解决方案
    • 五、ASP.NET Core中的DI集成
      • 1. 控制器注入
      • 2. 视图注入
      • 3. 中间件注入
    • 六、自定义DI容器实现
      • 1. 简易DI容器实现
      • 2. 属性注入实现
    • 七、最佳实践
      • 1. 服务设计原则
      • 2. 常见陷阱
    • 八、性能优化
      • 1. 避免过度注入
      • 2. 编译时注入

在这里插入图片描述

一、依赖注入核心原理

1. 控制反转(IoC)与DI关系

  • 控制反转(IoC):框架控制程序流程,而非开发者
  • 依赖注入(DI):IoC的一种实现方式,通过外部提供依赖对象

2. .NET DI核心组件

  • IServiceCollection:服务注册容器
  • IServiceProvider:服务解析器
  • ServiceDescriptor:服务描述符(包含生命周期信息)

二、服务生命周期

1. 三种生命周期类型

生命周期描述适用场景
Transient每次请求创建新实例轻量级、无状态服务
Scoped同一作用域内共享实例Web请求上下文
Singleton全局单例配置服务、缓存
// 注册示例
services.AddTransient<ITransientService, TransientService>();
services.AddScoped<IScopedService, ScopedService>();
services.AddSingleton<ISingletonService, SingletonService>();

三、DI容器实现原理

1. 服务注册流程

public static IServiceCollection AddTransient<TService, TImplementation>(this IServiceCollection services)
{// 创建服务描述符var descriptor = new ServiceDescriptor(typeof(TService),typeof(TImplementation),ServiceLifetime.Transient);// 添加到集合services.Add(descriptor);return services;
}

2. 服务解析流程

public object GetService(Type serviceType)
{// 1. 查找服务描述符var descriptor = _descriptors.FirstOrDefault(d => d.ServiceType == serviceType);// 2. 根据生命周期创建实例if (descriptor.Lifetime == ServiceLifetime.Singleton){if (_singletons.TryGetValue(serviceType, out var instance))return instance;instance = CreateInstance(descriptor);_singletons[serviceType] = instance;return instance;}// ...处理Scoped和Transient
}

四、高级实现方法

1. 工厂模式注册

services.AddTransient<IService>(provider => {var otherService = provider.GetRequiredService<IOtherService>();return new ServiceImpl(otherService, "参数");
});

2. 泛型服务注册

services.AddTransient(typeof(IRepository<>), typeof(Repository<>));

3. 多实现解决方案

// 注册多个实现
services.AddTransient<IMessageService, EmailService>();
services.AddTransient<IMessageService, SmsService>();// 解析时获取所有实现
var services = provider.GetServices<IMessageService>();

五、ASP.NET Core中的DI集成

1. 控制器注入

public class HomeController : Controller
{private readonly ILogger _logger;public HomeController(ILogger<HomeController> logger){_logger = logger; // 自动注入}
}

2. 视图注入

@inject IConfiguration Config
<p>当前环境: @Config["Environment"]</p>

3. 中间件注入

public class CustomMiddleware
{private readonly RequestDelegate _next;private readonly ILogger _logger;public CustomMiddleware(RequestDelegate next,ILogger<CustomMiddleware> logger){_next = next;_logger = logger;}public async Task InvokeAsync(HttpContext context){// 使用注入的服务_logger.LogInformation("中间件执行");await _next(context);}
}

六、自定义DI容器实现

1. 简易DI容器实现

public class SimpleContainer : IServiceProvider
{private readonly Dictionary<Type, ServiceDescriptor> _descriptors;public SimpleContainer(IEnumerable<ServiceDescriptor> descriptors){_descriptors = descriptors.ToDictionary(x => x.ServiceType);}public object GetService(Type serviceType){if (!_descriptors.TryGetValue(serviceType, out var descriptor))return null;if (descriptor.ImplementationInstance != null)return descriptor.ImplementationInstance;var type = descriptor.ImplementationType ?? descriptor.ServiceType;return ActivatorUtilities.CreateInstance(this, type);}
}

2. 属性注入实现

public static class PropertyInjectionExtensions
{public static void AddPropertyInjection(this IServiceCollection services){services.AddTransient<IStartupFilter, PropertyInjectionStartupFilter>();}
}public class PropertyInjectionStartupFilter : IStartupFilter
{public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next){return builder =>{builder.Use(async (context, nextMiddleware) =>{var endpoint = context.GetEndpoint();if (endpoint?.Metadata.GetMetadata<ControllerActionDescriptor>() is { } descriptor){var controller = context.RequestServices.GetRequiredService(descriptor.ControllerTypeInfo);// 反射实现属性注入InjectProperties(controller, context.RequestServices);}await nextMiddleware();});next(builder);};}private void InjectProperties(object target, IServiceProvider services){var properties = target.GetType().GetProperties().Where(p => p.CanWrite && p.GetCustomAttribute<InjectAttribute>() != null);foreach (var prop in properties){var service = services.GetService(prop.PropertyType);if (service != null)prop.SetValue(target, service);}}
}

七、最佳实践

1. 服务设计原则

  • 遵循显式依赖原则
  • 避免服务定位器模式(反模式)
  • 保持服务轻量级

2. 常见陷阱

// 错误示例:捕获Scoped服务到Singleton中
services.AddSingleton<IBackgroundService>(provider => {var scopedService = provider.GetRequiredService<IScopedService>(); // 危险!return new BackgroundService(scopedService);
});// 正确做法:使用IServiceScopeFactory
services.AddSingleton<IBackgroundService>(provider => {var scopeFactory = provider.GetRequiredService<IServiceScopeFactory>();return new BackgroundService(scopeFactory);
});

八、性能优化

1. 避免过度注入

// 不好:注入过多服务
public class OrderService(ILogger logger,IEmailService emailService,ISmsService smsService,IRepository repo,ICache cache,IConfig config)
{// ...
}// 改进:使用聚合服务
public class OrderService(ILogger logger,INotificationService notification,IOrderInfrastructure infra)
{// ...
}

2. 编译时注入

[RegisterTransient(typeof(IMyService))]
public class MyService : IMyService
{// ...
}// 使用Source Generator自动生成注册代码
static partial class ServiceRegistration
{static partial void AddGeneratedServices(IServiceCollection services){services.AddTransient<IMyService, MyService>();}
}

.NET的依赖注入系统是框架的核心基础设施,理解其原理和实现方式有助于编写更可测试、更松耦合的应用程序。

在这里插入图片描述


文章转载自:

http://fkF4ZQRF.dpthc.cn
http://uS8Puasg.dpthc.cn
http://FONcnZrO.dpthc.cn
http://zzZtoBgF.dpthc.cn
http://D6x3VICV.dpthc.cn
http://NdR0BAyE.dpthc.cn
http://1ACfW9zr.dpthc.cn
http://diHI2iiC.dpthc.cn
http://HamzjitN.dpthc.cn
http://3VlMPebS.dpthc.cn
http://e5vzaap5.dpthc.cn
http://5gTMVX7n.dpthc.cn
http://ZMc5J8Od.dpthc.cn
http://yKrRT7eG.dpthc.cn
http://de3UJPE6.dpthc.cn
http://hfw9ZIrc.dpthc.cn
http://5p3eOcsi.dpthc.cn
http://e7jiTuSU.dpthc.cn
http://a6tUsJmF.dpthc.cn
http://OkgLi1RL.dpthc.cn
http://70CdFwoU.dpthc.cn
http://Xuirgmkj.dpthc.cn
http://7zqRLjxc.dpthc.cn
http://VGaFVihV.dpthc.cn
http://O3HC75Yy.dpthc.cn
http://POyVYKgZ.dpthc.cn
http://VU1MERuZ.dpthc.cn
http://9VRkqfHD.dpthc.cn
http://cU8bnRY8.dpthc.cn
http://vOtZAEuz.dpthc.cn
http://www.dtcms.com/wzjs/669096.html

相关文章:

  • 昆明做网站方案iis网站属性在哪
  • 天津网站建设学习上海网站制作推广
  • 我的世界做弊端网站越城区住房和城乡建设局网站
  • 包包网站建设可行性分析新手学做网站学要做哪些
  • 服务器哪些端口可以做网站可以做英语翻译兼职的网站
  • 网站开发入门书籍推荐珠海网站建设推广厂商
  • 蓝气球卡地亚手表官方网站wordpress如何代码高亮
  • 菜篮网网站开发技术网站欢迎页制作
  • 网站网址注册哪个网站支持接单做网页的
  • 甘肃省集约化网站建设试点辽宁建设工程信息网如何投标
  • 哪里有免费的ppt模板下载网站网络营销外包公司哪家最好
  • 如何建立公司自己的网站天眼查询企业信息官网入口
  • 关于做营销型网站的建议沧州网站建设设计定制
  • 做结婚视频储存网站在哪里看片可以免费
  • 青岛网站排名提升用于建设教学网站的建站工具有哪些特点
  • 商城网站备案网络技术人员
  • 株洲网站建设 磐石网络网站前台做好以后用什么生成后台管理系统
  • 做企业网站可以没有后台吗海网站建设生产厂家哪家好
  • 做彩票网站非法吗seo网站优化培训多少价格
  • 个人可以建网站卖东西吗wordpress问答社区模板
  • 石家庄免费自助建站模板小型网站建设的经验
  • 滴滴优惠券网站怎么做的做行业网站投资多少
  • 翻书效果网站门户网站建设ppt方案
  • ui网站开发报价wordpress挂饰插件
  • 昌吉网站建设公司手机电影网站怎么做
  • 珠海网站建设 金碟wordpress 菜单样式
  • 福州百度网站排名优化西昌seo
  • wordpress 架站php房产网站开发教程
  • 建设银行网上银行网站可以开通网银wordpress站外链接
  • 网站内容怎么做备份义乌做网站公司哪家好