LCLFramework框架之IOC

LCLFramework框架之依赖注入(IOC)职责


  1. 依赖注入(Dependency Injection,简称DI)
  2. 依赖查找(Dependency Lookup)
  3. 控制反转

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;

}

}

时间: 2024-11-08 17:18:33

LCLFramework框架之IOC的相关文章

LCLFramework框架 1.1 Pre-Alpha 源码公布

LCLFramework 框架简要说明: LCL 是一个管理类软件的快速开发框架,其目标主要专注于:1. 快速开发:    DDD.界面自动生成.数据库自动生成与升级.易用的业务逻辑编写框架.2. 产品线工程:    插件化业务模块积累(内置一个权限控制插件模块).客户化二次开发.实施配置平台.3. 一套代码,可同时生成并运行 C/S.单机版.B/S 三种应用程序.    C/S版本 与 单机版 代码重用率 100%.    C/S版本 与 B/S版本 重用服务端代码(完全重用服务层以下代码.结

LCLFramework框架之Plugin模式

Plugin模式在示例中的实际目的小结一下 Plugin模式是架构模式,在设计架构时,才有参考价值: Plugin模式主要是实现单一职责的封装,和扩展应用程序: Plugin与扩展的区别 插件稍不同于扩展(extension),插件通常依赖于主应用程序的接口,有一个它们可以运行的确定的界限.扩展则通常有更少的限制,也可以提供它们自己的接口.相同的是,它们通常都用来减少主应用程序的大小.提供一些可选的功能. 这里不得不提到Mozilla Firefox 和相关软件.它们使用一个叫做Add-on的名

LCLFramework框架之Repository模式

Respository模式在示例中的实际目的小结一下 Repository模式是架构模式,在设计架构时,才有参考价值: Repository模式主要是封装数据查询和存储逻辑: Repository模式实际用途:更换.升级ORM 引擎,不影响业务逻辑: Repository模式能提高测试效率,单元测试时,用Mock对象代替实际的数据库存取,可以成倍地提高测试用例运行速度. Repository与Dal的区别 Repository是DDD中的概念,强调Repository是受Domain驱动的,Re

LCLFramework框架之数据门户

LCLFramework框架之数据门户职责 形成统一的数据访问方式. LCLFramework框架之数据门户设计 数据门户分为客户端/服务端. LCLFramework框架之数据门户设计代码 数据门户交互实现: 1:WcfPortal 2:WebServicePortal /// <summary> /// 数据访问层执行的地点 /// </summary> public enum DataPortalLocation { /// <summary> /// 根据 LC

【框架】[Spring3]下载安装、开源框架与IoC控制反转详解

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 昨天刚刚初学Spring3,也许Spring3有点老了哈,不过还是先把3学了再去学习4吧,首先先介绍一下如何去下载Spring的必须包吧. (本篇博客适用于初学Spring的朋友) java spring4现在不推荐使用xml配置文件- 当然啦,这些知识点在Spring4还是可以用的. 不过我在这里详解的还是Spring3哈,见谅~ 下载SpringJAR包/文档: Spring官

LCLFramework框架之Service模式

Service模式介绍 领域中的一些概念不太适合建模为对象,即归类到实体对象或值对象,因为它们本质上就是一些操作,一些动作,而不是事物.这些操作或动作往往会涉及到多个领域对象,并且需要协调这些领域对象共同完成这个操作或动作.如果强行将这些操作职责分配给任何一个对象,则被分配的对象就是承担一些不该承担的职责,从而会导致对象的职责不明确很混乱.但是基于类的面向对象语言规定任何属性或行为都必须放在对象里面. 所以我们需要寻找一种新的模式来表示这种跨多个对象的操作,DDD认为服务是一个很自然的范式用来对

好程序员Java干货分享Spring框架之IOC原理

好程序员Java干货分享Spring框架之IOC原理,前言:Spring框架是我们进行企业级开发的最常用框架,本章我们将了解Spring框架,并学习Spring的IOC特性以及IOC的实现原理:注解和反射. Spring框架简介 Spring是一种轻量级的控制反转(IOC)和面向切面编程(AOP)的容器框架,能够为企业级开发提供一站式服务. Spring的优点有 1.方便解耦,简化开发 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度

dreamvc框架(一)ioc容器的集成

我的dreamvc框架终于写得差不多了,借鉴了很多开源框架,SpringMVC.Struts2等,目前放在github上面.地址请猛戳我 写得差不多了,是要写一个总结,把自己当时的思路记录下来!还有更多的工作要做! (一) 首先,IOC容器作为管理bean的重要工具,我们在日常的开发当中经常用到,最常用的就属SPRINGIOC了吧!当然,如果开发者不原理是用SPRINGIOC,那么你可以实现自己的容器,或者是用其他的3方ioc工具,只要实现dreamvc提供的IocFactory或者继承Abst

国人编写的开源 .net Ioc 框架——My.Ioc 简介

My.Ioc 是作者本人开发的一款开源 Ioc/Di 框架.它具有下面一些特点: 高效 高效主要反映在两个方面:速度和内存占用. 速度:通过使用泛型.缓存.动态生成代码.延迟注册.尽量使用抽象类而非接口等方式来提高框架的速度. 内存:多余的字段能不用的绝不用. 架构合理 便于扩展 配置简单 功能全面 面向服务考虑 易于使用 良好的交互性 安全 灵活性 零入侵