C#简单依赖注入解析类
来源:互联网 发布:俞兆林内裤怎么样知乎 编辑:程序博客网 时间:2024/06/16 15:37
本文提供一种简单的对象依赖注入解决方法,用于在类中根据特性依赖注入对于的对象,解放了手工new一个对象的劳力。本特性参考了Java Spring的依赖注入框架。
1、定义两个注解类型
/// <summary>/// Bean注解,用于定义Bean,注解在类上/// </summary>[AttributeUsage(AttributeTargets.Class)]public class Bean : Attribute {private String _value = "";public Bean() {}public Bean(String value) {this._value = value;}public string Value {get {return _value;}set {_value = value;}}}
/// <summary>/// Resource注解,用于注解需要注入资源的变量/// </summary>[AttributeUsage(AttributeTargets.Field)]public class Resource : Attribute {private String name = "";public Resource() {}public Resource(String name) {this.name = name;}public string Name {get {return name;}set {name = value;}}}
2、注解解析类
/// <summary>/// 简单注解框架<br>/// by yanhang0610/// </summary>public class SimpleAnnotation {// 存储扫描到的使用Bean注解的类Classprivate static Dictionary<String, Type> beanClasses = new Dictionary<String, Type>();private SimpleAnnotation() {}/** * 扫描程序集里添加了Bean注解的类 * @param pakageNames 包名全路径,可以有多个,多个的话用英文半角逗号","分隔 */public static void ScanBeans() {try {SimpleAnnotation.beanClasses.Clear();Type[] classes = Assembly.GetExecutingAssembly().GetTypes();foreach (Type clazz in classes) {// 判断Bean注解的classObject[] attrs = clazz.GetCustomAttributes(typeof(Bean), false);if (attrs != null && attrs.Length > 0) {Bean attribute = attrs[0] as Bean;CollectionUtils.PutKeyValueToDic<String, Type>(SimpleAnnotation.beanClasses, attribute.Value, clazz);}}} catch (Exception e) {LoggerUtils.RecordInfoAndDebugMessage(e, " 扫描Bean注解类出错!");}}/// <summary>/// 依赖注入<br>/// 将obj里添加了Resource注解的字段注入Resource name值对应的Bean对象,Resouce name值等于Bean value值/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>public static void DependencyInject<T>(T obj) {try {Type clazz = typeof(T);FieldInfo[] fields = clazz.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);foreach (FieldInfo field in fields) {Object[] attrs = field.GetCustomAttributes(typeof(Resource), false);if (attrs != null && attrs.Length > 0) {Resource attribute = attrs[0] as Resource;field.SetValue(obj, GetBeanInstance<Object>(attribute.Name));}}} catch (Exception e) {LoggerUtils.RecordInfoAndDebugMessage(e, "依赖注入Bean对象出错!");}}/// <summary>/// 获取添加了Bean注解的类class/// </summary>/// <param name="name">Bean注解的name属性</param>/// <returns></returns>public static Type GetBeanClass(String name) {return CollectionUtils.GetDicValue<String, Type, Type>(SimpleAnnotation.beanClasses, name);}/// <summary>/// 获取添加了Bean注解的类class的实例,多例/// </summary>/// <typeparam name="T"></typeparam>/// <param name="name">Bean注解的name属性</param>/// <returns></returns>public static T GetBeanInstance<T>(String name) {Type clazz = GetBeanClass(name);return clazz == null ? default(T) : (T) Activator.CreateInstance(clazz);}}
3、使用示例
public partial class CompanyInfoWindow : Window {private ILog baseLogger = SysLoggerManager.GetBaseLogger();[Resource(Name = "companyService")]private ICompanyService companyService;public CompanyInfoWindow() {InitializeComponent();SimpleAnnotation.DependencyInject(this);}}/** * Company Service * @author E-mail: yanhang0610@qq.com * Create Time:2016-10-15 18:40:39 */[Bean("companyService")]public class CompanyServiceImpl : ICompanyService {}
阅读全文
0 0
- C#简单依赖注入解析类
- Java简单依赖注入解析类
- C#依赖注入实例解析
- AngularJS 依赖注入解析
- 依赖注入的解析
- 依赖注入框架解析
- c#实现依赖注入
- c#的依赖注入
- C#依赖注入
- C# Unity依赖注入
- 依赖注入简单案例
- Spring配置文件解析-依赖注入
- DOM4j解析XML(依赖注入)
- Spring源码解析 依赖注入
- Spring源码解析 依赖注入
- Spring源码解析 依赖注入
- C#依赖注入(IOC)
- PHP依赖注入简单理解
- Ubuntu上离线安装包的制作与安装
- Camera Calibration calibrateCamera()
- 解决dubbo的vc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for
- 如何将python3.6软件的py文件打包成exe程序
- 15算法课程 226. Invert Binary Tree
- C#简单依赖注入解析类
- C语言之unsigned char和uint8_t
- hdu1272(基础并查集)
- # prototype和__proto__分析
- 利用反向传播训练多层神经网络的原理
- 华为笔试题(7)
- phpmyadmin 1146
- web测试的思考
- JavaScript原生事件委托以及JQuery事件委托on()的代码片段