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

[C#]在Microsoft DI中使用属性注入

背景

  • 有一些特殊需求,需要像StringBoot那样使用属性注入。(不推荐使用属性注入)

实现

  1. 设计一个属性注入注解: InjectAttribute
[AttributeUsage(AttributeTargets.Property)]
public class InjectAttribute : Attribute
{}
  1. 设计属性注入服务接口: IResolvedService
public interface IResolvedService<TService> where TService : class
{TService Service { get; }
}
  1. 实现属性注入服务
internal class ServiceResolver<TService> : IResolvedService<TService> where TService : class
{private static readonly ConcurrentDictionary<Type, PropertyInfo[]> _propertyCache = new();public ServiceResolver(IServiceProvider serviceProvider){Service = ResolveService(serviceProvider);}public TService Service { get; }private static void InjectProperties(IServiceProvider services, object instance){ArgumentNullException.ThrowIfNull(instance);var properties = _propertyCache.GetOrAdd(instance.GetType(), type =>type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(prop => prop.CanWrite && Attribute.IsDefined(prop, typeof(InjectAttribute))).ToArray());foreach (var property in properties){var dependency = services.GetService(property.PropertyType)?? throw new InvalidOperationException($"Failed to resolve dependency for property '{property.Name}' of type '{property.PropertyType.FullName}'.");property.SetValue(instance, dependency);}}private static TService ResolveService(IServiceProvider services){var service = services.GetService(typeof(TService));if (service is not TService typedService){throw new InvalidOperationException($"Unable to resolve service of type '{typeof(TService).FullName}'.");}InjectProperties(services, typedService);return typedService;}
}
  1. 在DI中注册服务
services.AddTransit(typeof(IResolvedService<>),typeof(ResolvedService<>));
  1. 定义属性注入
public class ExampleService
{[Inject] DependencyService Dependency { get; set; }
}
  1. 使用服务
  • 使用构造注入
public class SomeViewModel
{private readonly ExampleService _exampleService;public SomeViewModel(IResolvedService<ExampleService> exampleService){_exampleService = exampleService.Service;}
}
  • 使用ServiceProvider获取服务
IResolvedService resolver = serviceProvider.GetRequiredService<IResolvedService<ExampleService>();
ExampleService service = resolver.Service;

最后

spring官方也不推荐属性注入,微软没有支持这个也是正常的。这里给有需要的兄弟提供一下思路。

http://www.jsqmd.com/news/571754/

相关文章:

  • Oracle数据库内存结构概述
  • Bouncy Castle实战:5分钟搞定Java自签名证书生成(附常见错误排查)
  • Ostrakon-VL 扫描终端快速上手:Anaconda 环境下的 Python 调用全流程
  • 回转式格栅除污机生产厂家深度调研:技术实力、产品质量与市场口碑综合评测 - 品牌推荐大师
  • 执业药师考试培训机构哪家靠谱?亲测靠谱选课攻略 - 品牌测评鉴赏家
  • Python包管理避坑指南:为什么会出现Ignoring invalid distribution警告?
  • 千问3.5-2B入门教程:支持中文提示词的视觉语言模型,比Qwen-VL更轻更快
  • 基于物联网的指纹密码锁系统设计(有完整资料)
  • HuggingFace Arrow数据集高效加载与内存优化实战指南
  • GLM-Image开源大模型部署:HuggingFace Hub私有模型加载方法详解
  • 保姆级教程:用torchtext搞定AG_NEWS数据集加载与词表构建(避坑指南)
  • PyTorch中dim参数在tf.nn.functional.softmax(x, dim=-1)中的多维解析与应用
  • 乐器弹唱主旋律配合AI编曲软件,原创音乐人做歌曲的编曲伴奏更轻松
  • 2026年温湿度控制器厂家最新推荐榜:拨盘温湿度控制器、固定温湿度控制器、环境温湿度控制器、数显温湿度控制器、液晶温湿度控制器、智能温湿度控制器厂家选择指南 - 海棠依旧大
  • LXC OverlayFS
  • 5步高效掌握B站视频下载:BilibiliDown全流程应用指南
  • 3小时搭建专属中文法律AI助手:ChatLaw实战指南
  • 告别NeRF的慢与笨:用SplaTAM的3D高斯球,在普通笔记本上也能玩转实时RGB-D SLAM
  • Fast-LIVO2实战:如何让海康工业相机与Livox雷达实现时间戳硬同步?
  • 多动症干预措施是什么?哈氏训练在课堂注意力不集中和情绪管理中的应用是什么?
  • EDSR超分辨率镜像API调用教程:从单张测试到批量处理的进阶
  • 2026年4月徐州全包/二手房/别墅/毛坯房/老房翻新装修公司深度测评:五家实力派谁更值得托付? - 2026年企业推荐榜
  • 【学习】IP地址:数字世界的“门牌号”怎么读?
  • 避坑指南|快温变试验箱选型:四大核心要点(温变速率/质量/口碑/售后)详解 - 品牌推荐大师
  • 别再只用Hydra了!Kali下用Medusa暴力破解SSH密码的完整实战与对比(附线程调优心得)
  • 深入解析GATT:BLE数据传输的核心架构与实战应用
  • 阿里AI办公神器!3步上手,告别加班,效率翻倍!QoderWork深度解析
  • ChatGPT_JCM用户反馈收集:构建更好产品的用户研究方法
  • 从理论到实践:传递函数离散化方法对比与Matlab仿真指南
  • 告别闭集检测!用Grounding DINO + Python 3.11 实现‘一句话找图’的保姆级教程