博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net IOC框架入门之一 Unity
阅读量:6534 次
发布时间:2019-06-24

本文共 5996 字,大约阅读时间需要 19 分钟。

一、概述

  IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection)。

  作用:将各层的对象以松耦合的方式组织在一起,解耦,各层对象的调用完全面向接口。当系统重构的时候,代码的改写量将大大减少。
  依赖注入: 当一个类的实例需要另一个类的实例协助时,在传统的程序设计过程中,通常有调用者来创建被调用者的实例。然而采用依赖注入的方式,创建被调用者的工作不再由调用者来完成,因此叫控制反转,创建被调用者的实例的工作由IOC容器来完成,然后注入调用者,因此也称为依赖注入。

   Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器;

  它支持常用的三种依赖注入方式:构造器注入(Constructor Injection)、属性注入(Property Injection),以及方法调用注入(Method Call Injection)。

  现在Unity最新的版本的4.0版,可以在微软的开源站点 https://github.com/unitycontainer/unity 下载最新的发布版本。

  通过使用Unity,我们能轻松构建松耦合结构的程序,从而让整个程序框架变得清晰和易于维护。

二、简单示例

1.示例1

  创建一个mvc5项目 Web.Mvc,然后在创建一个Business类库,将类库添加引用到Web.Mvc项目,在Web.Mvc项目通过nuget添加unity.mvc5

类库代码

a、Business类库定义一个接口IUserService

namespace Business{    ///     /// 显示信息    ///     public interface IUserService    {        string Display(string mes);    }}

b、Business类库实现接口

namespace Business{    public class UserService : IUserService    {        ///         /// 显示信息        ///         ///         public string Display(string mes)        {            return "I say:" + mes;        }    }}

c、注册依赖使用依赖注入生效

在Web.Mvc项目的Global.asax进行注册 

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Optimization;using System.Web.Routing;using Business;using Microsoft.Practices.Unity;using Unity.Mvc5;namespace Web.Mvc{    public class MvcApplication : System.Web.HttpApplication    {        protected void Application_Start()        {            AreaRegistration.RegisterAllAreas();            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);            RouteConfig.RegisterRoutes(RouteTable.Routes);            BundleConfig.RegisterBundles(BundleTable.Bundles);            //注入 Ioc            var container = this.BuildUnityContainer();            DependencyResolver.SetResolver(new UnityDependencyResolver(container));        }        IUnityContainer BuildUnityContainer()        {            var container = new UnityContainer();            container.RegisterType
(); return container; } }}

d、使用

namespace Web.Mvc.Controllers{    public class HomeController : Controller    {        private IUserService userService;        public HomeController(IUserService userService)        {            this.userService = userService;        }        public ActionResult Index()        {            ViewBag.Msg = userService.Display("hahaha");            return View();        }   }}

e、在Index.cshtml找个地方写入@ViewBag.Msg 就可以,如

ASP.NET - @ViewBag.Msg

最后运行项目,实现效果

ASP.NET - I say:hahaha

三、注册封装

对步骤c 的注册进行独立封装到BootStrapper中

c、注册依赖使用依赖注入生效

在Web.Mvc项目的Global.asax进行注册 

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Optimization;using System.Web.Routing;using Business;using Microsoft.Practices.Unity;using Unity.Mvc5;namespace Web.Mvc{    public class MvcApplication : System.Web.HttpApplication    {        protected void Application_Start()        {            AreaRegistration.RegisterAllAreas();            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);            RouteConfig.RegisterRoutes(RouteTable.Routes);            BundleConfig.RegisterBundles(BundleTable.Bundles);            //注入 Ioc             BootStrapper.Initialise();        }     }}

BootStrapper代码

using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using System.Web;using System.Web.Mvc;using Business;using Microsoft.Practices.Unity;using Microsoft.Practices.Unity.Configuration;using Unity.Mvc5;namespace Web.Mvc{    public class BootStrapper    {        ///         /// 获取容器-注册依赖关系        ///         /// 
public static IUnityContainer Initialise() { var container = BulidUnityContainer(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); return container; } /// /// 加载容器 /// ///
private static IUnityContainer BulidUnityContainer() { var container = new UnityContainer(); RegisterTypes(container); return container; } /// /// 实施依赖注入 /// /// private static void RegisterTypes(IUnityContainer container) { //类型的配置容器注册 container.RegisterType
(); //container.RegisterType
(new ContainerControlledLifetimeManager());//通过生命周期实现了单例模式 //已有对象实例的配置容器注册,也为单例 //UserService userService = new UserService(); //container.RegisterInstance
(userService); } }}

Unity注册配置

 修改上面的方法,将注册放到配置文件中

1.方法修改

///         /// 实施依赖注入        ///         ///         private static void RegisterTypes(IUnityContainer container)        {            依赖关系可以选择代码形式,也可以用配置文件的形式            UnityConfigurationSection config = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName);            config.Configure(container, "defaultContainer");         }
UnityConfigurationSection.SectionName为unity

2.配置文件

 提示:自定义web.config节点来实现

或者为

直接指定命名空间

或者为

指定程序集名称

 

 

 

参考网址:

http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html

https://www.lanhusoft.com/Article/108.html

http://blog.csdn.net/xingxing513234072/article/details/21176247

http://www.cnblogs.com/wwj1992/p/6728370.html

http://www.cnblogs.com/xishuai/p/3670292.html(推荐)

 

 

 
 
你可能感兴趣的文章
tarjan进阶
查看>>
第一季度绩效填写
查看>>
【LeetCode每天一题】Construct Binary Tree from Preorder and Inorder Traversal(使用前序和中序遍历构建二叉树)...
查看>>
Mysql性能基本测试
查看>>
洛谷 P1126 机器人搬重物
查看>>
java.lang.ClassFormatError
查看>>
NYOJ 简单数据结构
查看>>
结对编程,第二周作业
查看>>
避雷针 Lightning Conductor
查看>>
产品家:你的闷骚,我的产品!
查看>>
在vue里面使用jquery不生效问题
查看>>
[linux] C语言Linux系统编程进程基本概念
查看>>
MongoDB-C#驱动基本操作
查看>>
【笔记】最长递增子序列 Longest increasing subsequence(LIS)
查看>>
2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>
查看>>
JAVA自学笔记13
查看>>
正则01
查看>>
Python cookbook笔记——求N个最大最小元素及lambda表达式
查看>>
制作支持UEFI PC的Server2008 R2系统安装U盘
查看>>
java注解[转]
查看>>