ASP.NET MVC中使用Unity Ioc Container

时间:2022-11-08 14:45:28

写在前面

  关于Unity的使用可以参照《Unity依赖注入使用详解》,依赖注入的概念参照《小菜学习设计模式(五)—控制反转(Ioc)》。

  在MVC中,控制器依赖于模型对数据进行处理,也可以说执行业务逻辑。我们可以使用依赖注入(DI)在控制层分离模型层,这边要用到Repository模式,在领域驱动设计(DDD)中,Repository翻译为仓储,顾名思义,就是储存东西的仓库,可以理解为一种用来封装存储,读取和查找行为的机制,它模拟了一个对象集合。使用依赖注入(DI)就是对Repository进行管理,用于解决它与控制器之间耦合度问题,下面我们一步一步做一个简单示例。

安装Unity

  首先我们需要新建一个UnityMVCDemo项目(ASP.NET MVC4.0),选择工具-库程序包管理器-程序包管理控制台,输入“Install-Package Unity.Mvc4”命令,VS2010可能需要先安装NuGet。

ASP.NET MVC中使用Unity Ioc Container

  或者通过工具-库程序包管理器-管理解决方案的 NuGet 程序包,通过联机搜索“Unity.Mvc4”进行安装。

ASP.NET MVC中使用Unity Ioc Container

  在安装过程中可能会遇到下面这样错误:

ASP.NET MVC中使用Unity Ioc Container

  根据异常信息,可以肯定是项目的.net framework版本无法安装Unity,这种安装VS会自动搜索Unity最新版本,但是最新版本往往有. net framework版本要求,不知道有没有指定Unity版本安装,可以看到我们安装的是Unity3.0版本,修改一下项目. net framework的版本为4.5,重新安装就可以了。

  安装Unity成功后,我们发现项目中多了“Microsoft.Practices.Unity”和“Microsoft.Practices.Unity.Configuration”两个引用,还有一个Bootstrapper类文件,Bootstrapper翻译为引导程序,也就是Ioc容器。

     public static class Bootstrapper
{
public static IUnityContainer Initialise()
{
var container = BuildUnityContainer(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); return container;
} private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer(); // register all your components with the container here
// it is NOT necessary to register your controllers // e.g. container.RegisterType<ITestService, TestService>();
RegisterTypes(container); return container;
} public static void RegisterTypes(IUnityContainer container)
{ }
}

添加服务层

  首先我们添加一个Article实体类:

     /// <summary>
/// Article实体类
/// </summary>
public class Article
{
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public string Content { get; set; }
public DateTime CreateTime { get; set; }
}

  一般Repository都有一些相似的操作,比如增删改查,我们可以把它抽象为IArticleRepository接口,这样控制器依赖于抽象接口,而不依赖于具体实现Repository类,符合依赖倒置原则,我们才可以使用Unity进行依赖注入。

     /// <summary>
/// IArticleRepository接口
/// </summary>
public interface IArticleRepository
{
IEnumerable<Article> GetAll();
Article Get(int id);
Article Add(Article item);
bool Update(Article item);
bool Delete(int id);
}

  创建ArticleRepository,依赖于IArticleRepository接口,实现基本操作。

     public class ArticleRepository : IArticleRepository
{
private List<Article> Articles = new List<Article>(); public ArticleRepository()
{
//添加演示数据
Add(new Article { Id = , Title = "UnityMVCDemo1", Content = "UnityMVCDemo", Author = "xishuai", CreateTime = DateTime.Now });
Add(new Article { Id = , Title = "UnityMVCDemo2", Content = "UnityMVCDemo", Author = "xishuai", CreateTime = DateTime.Now });
Add(new Article { Id = , Title = "UnityMVCDemo2", Content = "UnityMVCDemo", Author = "xishuai", CreateTime = DateTime.Now });
}
/// <summary>
/// 获取全部文章
/// </summary>
/// <returns></returns>
public IEnumerable GetAll()
{
return Articles;
}
/// <summary>
/// 通过ID获取文章
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Article Get(int id)
{
return Articles.Find(p => p.Id == id);
}
/// <summary>
/// 添加文章
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public Article Add(Article item)
{
if (item == null)
{
throw new ArgumentNullException("item");
}
Articles.Add(item);
return item;
}
/// <summary>
/// 更新文章
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public bool Update(Article item)
{
if (item == null)
{
throw new ArgumentNullException("item");
} int index = Articles.FindIndex(p => p.Id == item.Id);
if (index == -)
{
return false;
}
Articles.RemoveAt(index);
Articles.Add(item);
return true;
}
/// <summary>
/// 删除文章
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool Delete(int id)
{
Articles.RemoveAll(p => p.Id == id);
return true;
}
}

IArticleRepository类型映射

  上面工作做好后,我们需要在Bootstrapper中的BuildUnityContainer方法添加此类型映射。

         private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer(); // register all your components with the container here
// it is NOT necessary to register your controllers container.RegisterType<IArticleRepository, ArticleRepository>(); // e.g. container.RegisterType<ITestService, TestService>();
RegisterTypes(container); return container;
}

  我们还可以在配置文件中添加类型映射,UnityContainer根据配置信息,自动注册相关类型,这样我们就只要改配置文件了,当然推荐是这种方法,配置文件:

   <configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Microsoft.Practices.Unity.Configuration" />
</configSections>
<unity>
<containers>
<container name="defaultContainer">
<register type="UnityMVCDemo.Models.IArticleRepository, UnityMVCDemo" mapTo="UnityMVCDemo.Models.ArticleRepository, UnityMVCDemo"/>
</container>
</containers>
</unity>

  注意configSections节点要放在configuration节点下的第一个节点,关于Unity的配置文件配置参照http://www.cnblogs.com/xishuai/p/3670292.html,加载配置文件代码:

     UnityConfigurationSection configuration = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName);
configuration.Configure(container, "defaultContainer");

  上面这段代码替换掉上面使用的RegisterType方法。

服务注入到控制器

  在ArticleController中我们使用是构造器注入方式,当然还有属性注入和方法注入,可以看到ArticleController依赖于抽象IArticleRepository接口,而并不是依赖于ArticleRepository具体实现类。

     public class ArticleController : Controller
{
readonly IArticleRepository repository;
//构造器注入
public ArticleController(IArticleRepository repository)
{
this.repository = repository;
} public ActionResult Index()
{
var data = repository.GetAll();
return View(data);
}
}

Global.asax初始化

  做完上面的工作后,我们需要在Global.asax中的Application_Start方法添加依赖注入初始化。

     // Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes); Bootstrapper.Initialise();
}
}

后记

  示例代码下载:http://pan.baidu.com/s/1qWoCy9e

  如果你觉得本篇文章对你有所帮助,请点击右下部“推荐”,^_^

ASP.NET MVC中使用Unity Ioc Container的更多相关文章

  1. MVC中使用Unity Ioc Container

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

  2. ASP&period;NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...

  3. 在ASP&period;NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请求的 Controller,让Controller ...

  4. IOC 容器在 ASP&period;NET MVC 中的应用

    IOC 容器在 ASP.NET MVC 中的应用 IOC:Inversion Of Control 翻译为控制反转,我们在面向对象软件开发过程中,一个应用程序它的底层结构可能由N种不同的构件来相互协作 ...

  5. ADO&period;NET &period;net core2&period;0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP&period;NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C&num; AutoMapper 了解一下

    ADO.NET   一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data  → DataTable, ...

  6. 在ASP&period;NET MVC中使用Castle Windsor

    平常用Inject比较多,今天接触到了Castle Windsor.本篇就来体验其在ASP.NET MVC中的应用过程. Visual Studio 2012创建一个ASP.NET MVC 4网站. ...

  7. Asp&period;net Mvc中利用ValidationAttribute实现xss过滤

    在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...

  8. &lbrack;转&rsqb;ASP&period;NET MVC中你必须知道的13个扩展点

    本文转自:http://www.cnblogs.com/ejiyuan/archive/2010/03/09/1681442.html ScottGu在其最新的博文中推荐了Simone Chiaret ...

  9. Asp&period;net mvc 中Action 方法的执行&lpar;二&rpar;

    [toc] 前面介绍了 Action 执行过程中的几个基本的组件,这里介绍 Action 方法的参数绑定. 数据来源 为 Action 方法提供参数绑定的原始数据来源于当前的 Http 请求,可能包含 ...

随机推荐

  1. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  2. 深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的

    前言 跟我一起顺藤摸瓜剖析 Artech 老师的 MiniMVC 是如何运行的,了解它,我们就大体了解 ASP.NET MVC 是如何运行的了.既然是“顺藤摸瓜”,那我们就按照 ASP.NET 的执行 ...

  3. C&plus;&plus; 泛型编程&sol;模板 泛函编程&sol;Lambda&sol;λ演算

    1.泛型编程(C++模板) 其中,Ada, Delpha, Java, C#, Swift 称之为 泛型/generics; ML, Scala和 Haskell 称之为 参数多态/parametri ...

  4. ASP&period;NET SignalR 2&period;0入门指南

    ASP.NET SignalR 2.0入门指南 介绍SignalR ASP.NET SignalR 是一个为 ASP.NET 开发人员的库,简化了将实时 web 功能添加到应用程序的过程.实时Web功 ...

  5. HTML篇(上)

    1.Doctype作用?标准模式与兼容模式有什么区别? (1)<!doctype>声明位于HTML文档中的第一行,处于<html>标签之前.告知浏览器的解析器用什么文档标准解析 ...

  6. haproxy实现会话保持&lpar;2&rpar;&colon;stick table

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. 报错:ERROR ParcelUpdateService&colon;com&period;cloudera&period;parcel&period;components&period;ParcelDownloaderImpl&colon; Unable to retrieve remote parcel repository manifest

    报错背景: CDH断电后重启失败,解决了种种错误之后,重启成功,但是重启之后的服务器没有任何进程, 查看/opt/cm-5.15.1/log/cloudera-scm-server/cloudera- ...

  8. &lbrack;Swift-2019力扣杯春季初赛&rsqb;2&period; 校园自行车分配

    在由 2D 网格表示的校园里有 n 位工人(worker)和 m 辆自行车(bike),n <= m.所有工人和自行车的位置都用网格上的 2D 坐标表示. 我们需要为每位工人分配一辆自行车.在所 ...

  9. WebService 学习记录

    -------------------------------------------PS:这个WebService 服务必须一直开着,关闭就没法访问了 Web Service 教程 一.webser ...

  10. springboot2 生产部署注意事项【持续更新】

    注意事项1. 去除不需要的 jar 开发工具 jar :springs-boot-devtools2. 监控一定要做好权限制或者去除 控制 jar :spring-boot-starter-actua ...