Unity框架,是一个经典的IoC模式实现方式,其通过config文件配置section,将接口与实现解藕,config中的section配置的container以全名称对应,使得应用程序无需像Ninject方式那样,依赖接口项和实现项,因其解藕的配置,能让应用程序实现静态更新服务的效果,即不退出应用程序更新服务的功能。

下面是Unity的实现,其核心接口IUnityContainer是Unity模式实现的基础,在Controller生命周期中IUnityContainer起到传递section配置的作用,在Controller实例化时创建依赖的接口服务的实例对象,当Countroller执行结束后,接口服务的实例对象交由IUnityContainer维护

首先需要安装Unity,引用以下两个dll

接下来实现Unity的管理类,新建mvc5网站项目,并如下实现

public class UnityControllerFactory : DefaultControllerFactory
{
static object syncHelper = new object();
static Dictionary<string, IUnityContainer> containers = new Dictionary<string, IUnityContainer>();
public IUnityContainer UnityContainer { get; private set; }
public UnityControllerFactory(string containerName = "")
{
if (containers.ContainsKey(containerName))
{
this.UnityContainer = containers[containerName];
return;
}
lock (syncHelper)
{
if (containers.ContainsKey(containerName))
{
this.UnityContainer = containers[containerName];
return;
}
IUnityContainer container = new UnityContainer();
//配置UnityContainer
UnityConfigurationSection configSection = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection;
if (null == configSection && !string.IsNullOrEmpty(containerName))
{
throw new ConfigurationErrorsException("The <unity> configuration section does not exist.");
}
if (null != configSection)
{
if (string.IsNullOrEmpty(containerName))
{
configSection.Configure(container);
}
else
{
configSection.Configure(container, containerName);
}
}
containers.Add(containerName, container);
this.UnityContainer = containers[containerName];
}
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (null == controllerType)
{
return null;
}
return (IController)this.UnityContainer.Resolve(controllerType);
}
public override void ReleaseController(IController controller)
{
this.UnityContainer.Teardown(controller);
}
}

假设有一个服务接口在一个独立的C#类库名为MyInterface

public interface IEmployeeRepository
{
IEnumerable<Employee> GetEmployees(string id = "");
}

和服务接口的实现项在一个独立的C#类库名为MyService

public class EmployeeRepository: IEmployeeRepository
{
private static IList<Employee> employees;
static EmployeeRepository()
{
employees = new List<Employee>();
employees.Add(new Employee(Guid.NewGuid().ToString(), "张三", "男", new DateTime(, , ), "销售部"));
employees.Add(new Employee(Guid.NewGuid().ToString(), "李四", "女", new DateTime(, , ), "人事部"));
employees.Add(new Employee(Guid.NewGuid().ToString(), "王五", "男", new DateTime(, , ), "人事部"));
}
public IEnumerable<Employee> GetEmployees(string id = "")
{
return employees.Where(e => e.Id == id || string.IsNullOrEmpty(id) || id == "*");
}
}

在上面新建的mvc5网站项目中,引用MyInterface的C#类库,在网站的global文件中Application_Start中添加如下这句,将我们创建的UnityControllerFactory注入给ControllerBuilder初始化

ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory());

在mvc5网站的web.config中添加section接口服务map信息,将接口与其服务实现类信息配置给Unity

<unity>
<containers>
<container>
<register type="Mvc.IEmployeeRepository, Mvc.MvcApp"
mapTo="Mvc.EmployeeRepository, Mvc.MvcApp"/>
</container>
</containers>
</unity>

Unity与于Ninject的好处很明显,接口与实现解藕,无需直接依赖实现项,达到静态更新的效果,在应用程序运行时,只需将实现项的DLL(此处即为MyService.dll)下载替换,即可实现服务更新,要实现自动化静态更新当然需要做些工作,比如MyService应该需要版本检测及下载功能,有兴趣的可以做做

如果想深入了解Unity的对象管理,可以看看老A的这篇文章, 本文参考老A的MVC IoC系列文章

http://www.cnblogs.com/artech/archive/2010/07/13/IoC_Unity_Build.html

Unity IoC Base On MVC的更多相关文章

  1. MVC中使用Unity Ioc Container

    ASP.NET MVC中使用Unity Ioc Container   写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始 ...

  2. Unity + iBatis + Asp.net Mvc 系统搭建

    Unity + iBatis + Asp.net Mvc 系统搭建 之前用EntityFramework Code First做了一些小项目,很是方便:后来在一个 Java 项目中接触了myBatis ...

  3. 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入

    前言:在C/S架构上,WPF无疑已经是"桌面一霸"了.在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用.但是WPF也有很多年的历史了,并且基于MVVM ...

  4. 总结Unity IOC容器通过配置实现类型映射的几种基本使用方法

    网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下: unityContainer = new Un ...

  5. IOC运用到MVC中

    IOC可以摒弃掉类中类的紧耦合,让设计和重用更简单,将IOC加入到MVC中的实现非常简单,那么有哪几种方法?它们的实现又是什么原理呢? IOC在MVC中的注入,主要是在获取Controller对象中实 ...

  6. Unity IOC容器通过配置实现类型映射的几种基本使用方法

    网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下 unityContainer = new Uni ...

  7. .NET Unity IOC框架使用实例

    1.IOC简介 IOC(Inversion of Control), 控制反转 DI (Dependency Injection),依赖注入 IOC的基本概念是:不创建对象,但是描述创建它们的方式.在 ...

  8. 今天研究Unity Ioc 框架

    今天研究Unity Ioc 框架,被自己坑了两个多小时. 运行就报错,反反复复检查了很多次,配置文件,代码都没有问题,也从新写了好几遍. 最后仔细看报错消息才知道,config文件没有生成到目录……… ...

  9. Unity Ioc 依赖倒置及Untity AOP被动拦截/自动拦截

    各位博友金安,首先声明这是一篇转载的博客,原文链接:https://www.cnblogs.com/scottpei/archive/2013/01/08/2851087.html 十年河东,十年河西 ...

随机推荐

  1. Flutter 集成到现有iOS工程

    前沿 由于我司已经有自己的App,flutter属于技术引进的一部分,也不太可能重新启动一个项目,因此目前我们是将flutter模块形式注入我们的App之中.即:将flutter模块集成到现在有iOS ...

  2. iOS进阶五-RunLoop

    简介 RunLoop 运行循环.跑圈 RunLoop的作用主要体现在三方面: 1.保持程序持续运行 2.处理App中的各种事件(比如触摸事件.定时器事件.Selector事件) 3.节省CPU资源,提 ...

  3. SpringMVC常用注解知识总结

    1.@Controller 注解到类名上,表示该类是控制器. 2.@RequestMapping("/xxxx") 可以放在类名/方法名之上,表示访问请求该方法时的url.如果该方 ...

  4. Maven - Scope区别

    依赖的Scope scope定义了类包在项目的使用阶段.项目阶段包括: 编译,运行,测试和发布. 分类说明 compile 默认scope为compile,表示为当前依赖参与项目的编译.测试和运行阶段 ...

  5. yii2.0 数据库查询操作

    User::find()->all();    此方法返回所有数据:    User::findOne($id);   此方法返回 主键 id=1  的一条数据(举个例子):    User:: ...

  6. 解决eclipse启动时出现“failed to load the jni shared library”

    如何解决启动eclipse出现failed to load the jni shared library的问题 问题描述:启动eclipse时,出现以下弹出框 此时,即表示eclispe和jdk位数不 ...

  7. js 过滤非法字符

    demo = 'zhang#@$san'; reg=/[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/im; if(reg.test(demo)){ t ...

  8. 18.scrapy_maitian

    ershoufang.py # -*- coding: utf-8 -*- import scrapy class ErshoufangSpider(scrapy.Spider): name = 'e ...

  9. VM 虚拟机使用桥接模式却连不上网的解决办法(转载)

    只需将VM的虚拟网络编辑器中关于 VMnet0 的设置改一下就行了: 1.进入VMware的 编辑 -> 虚拟网络编辑器. 第一步 2.选择更改设置. 3.将VMnet0(或其它类型为桥接模式的 ...

  10. Python - 作为浅拷贝的list对象乘法

    运行下面这段代码 # !/usr/bin/env python3 # -*- coding=utf-8 -*- temp_a = [[0]*2]*3 temp_b = [[0]*2 for i in ...