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. item字母问题

    解决方法:复写toString方法 @Override public String toString() { return this.getBookTypeName(); } 将对象的toString ...

  2. django中写form表单时csrf_token的作用

    之前在学习django的时候,在template中写form时,出现错误.百度,google后要加{% csrf_token %}才可以,之前一直也没研究,只是知道要加个这个东西,具体是什么也不明白. ...

  3. TStringList常用操作

    TStringList常用操作 //TStringList 常用方法与属性: var List: TStringList; i: Integer; begin List := TStringList. ...

  4. 最最最详细的IDEA导入Eclipse项目

    很详细的IDEA导入Eclipse项目,配置tomcat并运行项目 1.把Eclipse项目复制一份,放到自己指定的位置 2.打开Idea,在进入工程前选择,inmport Project 注意事项: ...

  5. 第四周课堂笔记1th

    函数   关键字def   函数名加括号  是调用函数   Return   相当于给函数算完之后给予另一个返回值   返回的是元组 如果return后没写返回none Return在函数中可以结束整 ...

  6. JVM实战

    一.内存溢出 虚拟机栈和本地方法栈溢出:-Xss256k package com.jedis; import java.util.LinkedList; import java.util.List; ...

  7. mac os Catalina beta Jetbrains idea闪退解决方案

    第一时间升级最新版本的Catalina 10.15 Beta 版(19A501i) 后, 发现不管在idea 输入什么,都会直接crash. 不论是卸载重装还是,clean,结果都是一样的. 在网上查 ...

  8. 2019-8-31-dotnet-通过-WMI-获取系统启动的服务

    title author date CreateTime categories dotnet 通过 WMI 获取系统启动的服务 lindexi 2019-08-31 16:55:59 +0800 20 ...

  9. mount: you must specify the filesystem type

    最近工作中遇到一个问题,在linux mount /dev/vdb 到 /home 分区时报错:   1 2 # mount /dev/vdb /home mount: you must specif ...

  10. JS数组 二维数组 二维数组的表示 方法一: myarray[ ][ ];方法二:var Myarr = [[0 , 1 , 2 ],[1 , 2 , 3, ]]

    二维数组 一维数组,我们看成一组盒子,每个盒子只能放一个内容. 一维数组的表示: myarray[ ] 二维数组,我们看成一组盒子,不过每个盒子里还可以放多个盒子. 二维数组的表示: myarray[ ...