LCLFramework框架之IOC
我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。
借助于“第三方”实现具有依赖关系的对象之间的解耦,如下图:
LCLFramework框架之依赖注入(IOC)职责
- 依赖注入(Dependency Injection,简称DI)
- 依赖查找(Dependency Lookup)
- 控制反转
LCLFramework框架之依赖注入(IOC)设计
网上有很多的IOC框架如何让用户选择自己熟悉的IOC框架了,那LCL就需要提供可扩展的IOC应该如何让框架注入自己熟悉的IOC框架呢?
下图是基本的IOC扩展契约,所有的第三方都要实现IObjectContainer契约,下图中实现了,Unity,TinyIoc两个第三方IOC框架。
抛弃了ObjectContainer类,直接使用接口进行扩展
LCLFramework框架之依赖注入(IOC)设计代码
/// <summary> /// 表示持久化事件时出现的并发异常 /// </summary> public interface IObjectContainer { /// <summary> /// 注册一个给定的类型及其所有实现的接口 /// </summary> /// <param name="type"></param> void RegisterType(Type type); /// <summary> /// 注册一个给定的类型及其所有实现的接口 /// </summary> /// <param name="type"></param> /// <param name="key"></param> void RegisterType(Type type, string key); /// <summary> /// 注册给定程序集中符合条件的所有类型 /// </summary> /// <param name="typePredicate"></param> /// <param name="assemblies"></param> void RegisterTypes(Func<Type, bool> typePredicate, params Assembly[] assemblies); /// <summary> /// 注册给定接口的实现 /// </summary> /// <typeparam name="TService"></typeparam> /// <typeparam name="TImpl"></typeparam> /// <param name="life"></param> void Register<TService, TImpl>(LifeStyle life) where TService : class where TImpl : class, TService; /// <summary> /// 注册给定接口的实现 /// </summary> /// <typeparam name="TService"></typeparam> /// <typeparam name="TImpl"></typeparam> /// <param name="key"></param> /// <param name="life"></param> void Register<TService, TImpl>(string key, LifeStyle life = LifeStyle.Singleton) where TService : class where TImpl : class, TService; /// <summary> /// 注册给定接口的默认实现 /// </summary> /// <typeparam name="TService"></typeparam> /// <typeparam name="TImpl"></typeparam> /// <param name="life"></param> void RegisterDefault<TService, TImpl>(LifeStyle life) where TService : class where TImpl : class, TService; /// <summary> /// 注册给定类型的实例 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="instance"></param> /// <param name="life"></param> void Register<T>(T instance, LifeStyle life) where T : class; /// <summary> /// 注册给定类型的实例 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="instance"></param> /// <param name="key"></param> /// <param name="life"></param> void Register<T>(T instance, string key, LifeStyle life) where T : class; /// <summary> /// 判断给定的类型是否已经注册 /// </summary> /// <param name="type"></param> /// <returns></returns> bool IsRegistered(Type type); /// <summary> /// 判断给定的类型是否已经注册 /// </summary> /// <param name="type"></param> /// <param name="key"></param> /// <returns></returns> bool IsRegistered(Type type, string key); /// <summary> /// 获取给定类型的一个实例 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> T Resolve<T>() where T : class; /// <summary> /// 获取给定类型的一个实例 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> T Resolve<T>(string key) where T : class; /// <summary> /// 获取给定类型的一个实例 /// </summary> /// <param name="type"></param> /// <returns></returns> object Resolve(Type type); /// <summary> /// 获取给定类型的一个实例 /// </summary> /// <param name="key"></param> /// <param name="type"></param> /// <returns></returns> object Resolve(string key, Type type); } [DebuggerDisplay("ObjectContainer = {_container}")] public class ServiceLocator { private readonly IObjectContainer _container = LEnvironment.AppObjectContainer; public static readonly ServiceLocator Instance = new ServiceLocator(); private ServiceLocator() { } /// <summary> /// 注册一个给定的类型及其所有实现的接口 /// </summary> /// <param name="type"></param> public void RegisterType(Type type) { _container.RegisterType(type); } /// <summary> /// 注册一个给定的类型及其所有实现的接口 /// </summary> /// <param name="type"></param> /// <param name="key"></param> public void RegisterType(Type type, string key) { _container.RegisterType(type, key); } public void RegisterType(Type type, Type Impl) { //_container.RegisterType() } /// <summary> /// 注册给定程序集中符合条件的所有类型 /// </summary> /// <param name="typePredicate"></param> /// <param name="assemblies"></param> public void RegisterTypes(Func<Type, bool> typePredicate, params Assembly[] assemblies) { _container.RegisterTypes(typePredicate, assemblies); } /// <summary> /// 注册给定接口的实现 /// </summary> /// <typeparam name="TService"></typeparam> /// <typeparam name="TImpl"></typeparam> /// <param name="life"></param> public void Register<TService, TImpl>(LifeStyle life = LifeStyle.Singleton) where TService : class where TImpl : class, TService { _container.Register<TService, TImpl>(life); } /// <summary> /// 注册给定接口的实现 /// </summary> /// <typeparam name="TService"></typeparam> /// <typeparam name="TImpl"></typeparam> /// <param name="key"></param> /// <param name="life"></param> public void Register<TService, TImpl>(string key, LifeStyle life = LifeStyle.Singleton) where TService : class where TImpl : class, TService { _container.Register<TService, TImpl>(key, life); } /// <summary> /// 注册给定接口的默认实现 /// </summary> /// <typeparam name="TService"></typeparam> /// <typeparam name="TImpl"></typeparam> /// <param name="life"></param> public void RegisterDefault<TService, TImpl>(LifeStyle life = LifeStyle.Singleton) where TService : class where TImpl : class, TService { _container.RegisterDefault<TService, TImpl>(life); } /// <summary> /// 注册给定类型的实例 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="instance"></param> /// <param name="life"></param> public void Register<T>(T instance, LifeStyle life = LifeStyle.Singleton) where T : class { _container.Register<T>(instance, life); } /// <summary> /// 注册给定类型的实例 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="instance"></param> /// <param name="key"></param> /// <param name="life"></param> public void Register<T>(T instance, string key, LifeStyle life = LifeStyle.Singleton) where T : class { _container.Register<T>(instance, key, life); } /// <summary> /// 判断给定的类型是否已经注册 /// </summary> /// <param name="type"></param> /// <returns></returns> public bool IsRegistered(Type type) { return _container.IsRegistered(type); } /// <summary> /// 判断给定的类型是否已经注册 /// </summary> /// <param name="type"></param> /// <param name="key"></param> /// <returns></returns> public bool IsRegistered(Type type, string key) { return _container.IsRegistered(type, key); } /// <summary> /// 获取给定类型的一个实例 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public T Resolve<T>() where T : class { return _container.Resolve<T>(); } /// <summary> /// 获取给定类型的一个实例 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> public T Resolve<T>(string key) where T : class { return _container.Resolve<T>(key); } /// <summary> /// 获取给定类型的一个实例 /// </summary> /// <param name="type"></param> /// <returns></returns> public object Resolve(Type type) { return _container.Resolve(type); } /// <summary> /// 获取给定类型的一个实例 /// </summary> /// <param name="key"></param> /// <param name="type"></param> /// <returns></returns> public object Resolve(string key, Type type) { return _container.Resolve(key, type); } }
LCLFramework框架之IOC扩展
public class UnityObjectContainer : IObjectContainer { private IUnityContainer _unityContainer; public UnityObjectContainer() { _unityContainer = new UnityContainer(); } public UnityObjectContainer(IUnityContainer unityContainer) { _unityContainer = unityContainer; } public IUnityContainer UnityContainer { get { return _unityContainer; } } public void RegisterType(Type type) { var life = ParseLife(type); if (!_unityContainer.IsRegistered(type)) { if (life == LifeStyle.Singleton) { _unityContainer.RegisterType(type, new ContainerControlledLifetimeManager()); } else { _unityContainer.RegisterType(type); } } foreach (var interfaceType in type.GetInterfaces()) { if (!_unityContainer.IsRegistered(interfaceType)) { if (life == LifeStyle.Singleton) { _unityContainer.RegisterType(interfaceType, type, new ContainerControlledLifetimeManager()); } else { _unityContainer.RegisterType(interfaceType, type); } } } } public void RegisterType(Type type, string key) { var life = ParseLife(type); if (!IsRegistered(type, key)) { if (life == LifeStyle.Singleton) { _unityContainer.RegisterType(type, new ContainerControlledLifetimeManager()); } else { _unityContainer.RegisterType(type); } } foreach (var interfaceType in type.GetInterfaces()) { if (!IsRegistered(interfaceType, key)) { if (life == LifeStyle.Singleton) { _unityContainer.RegisterType(interfaceType, type, new ContainerControlledLifetimeManager()); } else { _unityContainer.RegisterType(interfaceType, type); } } } } public void RegisterTypes(Func<Type, bool> typePredicate, params Assembly[] assemblies) { foreach (var assembly in assemblies) { foreach (var type in assembly.GetExportedTypes().Where(x => typePredicate(x))) { RegisterType(type); } } } public void Register<TService, TImpl>(LifeStyle life = LifeStyle.Singleton) where TService : class where TImpl : class, TService { if (life == LifeStyle.Singleton) { _unityContainer.RegisterType<TService, TImpl>(new ContainerControlledLifetimeManager()); } else { _unityContainer.RegisterType<TService, TImpl>(); } } public void Register<TService, TImpl>(string key, LifeStyle life = LifeStyle.Singleton) where TService : class where TImpl : class, TService { if (life == LifeStyle.Singleton) { _unityContainer.RegisterType<TService, TImpl>(key, new ContainerControlledLifetimeManager()); } else { _unityContainer.RegisterType<TService, TImpl>(key); } } public void RegisterDefault<TService, TImpl>(LifeStyle life = LifeStyle.Singleton) where TService : class where TImpl : class, TService { if (life == LifeStyle.Singleton) { _unityContainer.RegisterType<TService, TImpl>(new ContainerControlledLifetimeManager()); } else { _unityContainer.RegisterType<TService, TImpl>(); } } public void Register<T>(T instance, LifeStyle life = LifeStyle.Singleton) where T : class { if (life == LifeStyle.Singleton) { _unityContainer.RegisterInstance<T>(instance, new ContainerControlledLifetimeManager()); } else { _unityContainer.RegisterInstance<T>(instance); } } public void Register<T>(T instance, string key, LifeStyle life = LifeStyle.Singleton) where T : class { if (life == LifeStyle.Singleton) { _unityContainer.RegisterInstance<T>(key, instance, new ContainerControlledLifetimeManager()); } else { _unityContainer.RegisterInstance<T>(key, instance); } } public bool IsRegistered(Type type) { return _unityContainer.IsRegistered(type); } public bool IsRegistered(Type type, string key) { return _unityContainer.IsRegistered(type, key); } public T Resolve<T>() where T : class { return _unityContainer.Resolve<T>(); } public T Resolve<T>(string key) where T : class { return _unityContainer.Resolve<T>(key); } public object Resolve(Type type) { return _unityContainer.Resolve(type); } public object Resolve(string key, Type type) { return _unityContainer.Resolve(type, key); } private static LifeStyle ParseLife(Type type) { var componentAttributes = type.GetCustomAttributes(typeof(ComponentAttribute), false); return componentAttributes.Count() <= 0 ? LifeStyle.Transient : (componentAttributes[0] as ComponentAttribute).LifeStyle; } }
LCLFramework框架之IOC的更多相关文章
- LCLFramework框架 1.1 Pre-Alpha 源码公布
使用开发框架的好处:1.框架在技术上为软件系统提供了完整的模式实践2.框架为团队提供了合理可行的软件开发过程模式3.框架的应用大大提高了团队的开发效率,团队只需要关注与领域相关的业务实现,而无需关注具 ...
- LCLFramework框架之Plugin模式
插件应用架构概述 基于LCLFramework插件框架的应用由以下三个部分构成: (1)主程序:针对特定应用环境(Web.WinForm等应用环境),加载启动插件,获取插件入口,运行入口程序. (2) ...
- LCLFramework框架之数据门户
LCLFramework框架之数据门户职责 形成统一的数据访问方式. LCLFramework框架之数据门户设计 数据门户分为客户端/服务端. LCLFramework框架之数据门户设计代码 数 ...
- LCLFramework框架之Service模式
Service模式介绍 领域中的一些概念不太适合建模为对象,即归类到实体对象或值对象,因为它们本质上就是一些操作,一些动作,而不是事物.这些操作或动作往往会涉及到多个领域对象,并且需要协调这些领域对象 ...
- LCLFramework框架之Repository模式
Respository模式在示例中的实际目的小结一下 Repository模式是架构模式,在设计架构时,才有参考价值: Repository模式主要是封装数据查询和存储逻辑: Repository模式 ...
- Spring框架(3)---IOC装配Bean(注解方式)
IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...
- Spring框架之IOC(控制反转)
[TOC] 第一章Spring框架简介 IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向 ...
- Spring框架中IoC(控制反转)的原理(转)
原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...
- Spring框架的IOC核心功能快速入门
2. 步骤一:下载Spring框架的开发包 * 官网:http://spring.io/ * 下载地址:http://repo.springsource.org/libs-release-local/ ...
随机推荐
- Matlab神经网络函数newff()新旧用法差异
摘要 在Matlab R2010a版中,如果要创建一个具有两个隐含层.且神经元数分别为5.3的前向BP网络,使用旧的语法可以这样写: net1 = newff(minmax(P), [5 3 1]); ...
- hadoop部署中遇到ssh设置的问题
尽管hadoop和一些培训视频课程上讲分布式部署比较详细,但是在部署时仍遇到了一些小问题,在此mark一下: 1.linux的namenode主机上安装了ssh,也启动了ssh,并且执行了: /etc ...
- java基础-jdbc——三种方式加载驱动建立连接
String url = "jdbc:mysql://localhost:3306/student?Unicode=true&characterEncoding=utf-8" ...
- split(),preg_split()与explode()函数分析与介
split(),preg_split()与explode()函数分析与介 发布时间:2013-06-01 18:32:45 来源:尔玉毕业设计 评论:0 点击:965 split()函数可以实 ...
- 数据库知识整理<一>
关系型数据库知识整理: 一,关系型数据库管理系统简介: 1.1使用数据库的原因: 降低存储数据的冗余度 提高数据的一致性 可以建立数据库所遵循的标准 储存数据可以共享 便于维护数据的完整性 能够实现数 ...
- python学习笔记:Day01
一.python 简介 1. python是Guido van Rossum在1989年圣诞节期间,为了打发无聊的假期而编写的一个编程语言 2. pyhton主要应用于数据分析.组件集成.网络 ...
- [ACM_模拟] ZJUT 1155 爱乐大街的门牌号 (规律 长为n的含k个逆序数的最小字典序)
Description ycc 喜欢古典音乐是一个 ZJUTACM 集训队中大家都知道的事情.为了更方便地聆听音乐,最近 ycc 特意把他的家搬到了爱乐大街(德语Philharmoniker-Stra ...
- Vue学习笔记1
目录 前言 1.vue和avalon一样,都不支持VM初始时不存在的属性 2.input元素中属性与v-model同时存在以属性为优先 3.VM中的函数放到data属性和methods属性中的区别,以 ...
- 【系统移植】kernel分析
内核启动流程 第二阶段 starte_kernel: | rest_init: | kernel_init | do_basic_setup(); // 加载驱动 | do_i ...
- iOS开发---集成百度地图完善版
一.成为百度的开发者.创建应用 http://developer.baidu.com/map/index.php?title=首页 (鼠标移向 然后选择你的项目需要的功能 你可以在里面了解到你想要使用 ...