.Net IOC框架入门之一 Unity

一、概述

  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,我们能轻松构建松耦合结构的程序,从而让整个程序框架变得清晰和易于维护。

二、简单示例

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

Business类库

  类库代码

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

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

  b、Business类库实现接口

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

 

示例一

  在Web.Mvc项目通过nuget添加unity.mvc5 (1.2.3)

   1.注册服务

  注册依赖使用依赖注入生效,在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<IUserService, UserService>();
            return container;
        }
    }
}

  2.注入服务

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 就可以,如

<h1>ASP.NET - @ViewBag.Msg</h1>

最后运行项目,实现效果

ASP.NET - I say:hahaha

示例二

  本示例为2017.12.08补充。

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

  命令:Install-Package Unity.Mvc5 -Version 1.3.0

  安装后如图

  

  1. 调用注册组件

  在Global.asax.cs 的Application_Start 方法添加 UnityConfig.RegisterComponents() ,MVC会使用 Unity.Mvc5的 DependencyResolver去解析服务

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            UnityConfig.RegisterComponents();//在此处添加
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

        }

  2.注册服务

  找到App_Start下的UnityConfig类,如下修改

 public static class UnityConfig
    {
        public static void RegisterComponents()
        {
            var container = new UnityContainer();

            //在这里使用container注册所有服务
            container.RegisterType<IUserService, UserService>();//自定义的服务

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        }
    }

  3.修改控制器Home和页面Index

  

public class HomeController : Controller
    {
        private IUserService userService;

        public HomeController(IUserService userService)
        {
            this.userService = userService;
        }

        public ActionResult Index()
        {
            ViewBag.Name = userService.Display("我是 UNITY 1.3.0");
            return View();
        }

页面代码

<div class="jumbotron">
    <h1>Unity 入门</h1>
    <p class="lead">@ViewBag.Name</p>
</div>
 

效果

 

三、注册封装

对示例一 的注册进行独立封装到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
    {
        /// <summary>
        /// 获取容器-注册依赖关系
        /// </summary>
        /// <returns></returns>
        public static IUnityContainer Initialise()
        {
            var container = BulidUnityContainer();
            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
            return container;
        }

        /// <summary>
        /// 加载容器
        /// </summary>
        /// <returns></returns>
        private static IUnityContainer BulidUnityContainer()
        {
            var container = new UnityContainer();
            RegisterTypes(container);
            return container;
        }

        /// <summary>
        /// 实施依赖注入
        /// </summary>
        /// <param name="container"></param>
        private static void RegisterTypes(IUnityContainer container)
        {
            //类型的配置容器注册
            container.RegisterType<IUserService, UserService>();
            //container.RegisterType<IUserService, UserService>(new ContainerControlledLifetimeManager());//通过生命周期实现了单例模式

            //已有对象实例的配置容器注册,也为单例
            //UserService userService = new UserService();
            //container.RegisterInstance<IUserService>(userService);

        }
    }
}

Unity注册配置

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

1.方法修改

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

2.配置文件

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

<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
    <!-- 一般将unity节点放到文件末尾 -->
  </configSections> 

  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <namespace name="Business" />
    <assembly name="Business" />
    <containers>
      <container name="defaultContainer">
        <register type="IUserService" mapTo="UserService">
          <lifetime type="singleton" />
        </register>
        <register type="ILocalUserService" mapTo="LocalUserService"/>
      </container>
    </containers>
  </unity>
</configuration>

或者为

直接指定命名空间

  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <assembly name="Business" />
    <containers>
      <container name="defaultContainer">
        <register type="Business.IUserService" mapTo="Business.UserService">
          <lifetime type="singleton" />
        </register>
        <register type="Business.ILocalUserService" mapTo="Business.LocalUserService"/>
      </container>
    </containers>
  </unity>

或者为

指定程序集名称

  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <containers>
      <container name="defaultContainer">
        <register type="Business.IUserService,Business" mapTo="Business.UserService,Business">
          <lifetime type="singleton" />
        </register>
        <register type="Business.ILocalUserService,Business" mapTo="Business.LocalUserService,Business"/>
      </container>
    </containers>
  </unity>

 

 源码下载:https://gitee.com/zmsofts/XinCunShanNianDaiMa/blob/master/IocDemo.rar

 

参考网址:

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(推荐)

 

时间: 2024-09-25 03:37:12

.Net IOC框架入门之一 Unity的相关文章

.Net IOC框架入门之二 CastleWindsor

一.简介 Castle是.net平台上的一个开源项目,为企业级开发和WEB应用程序开发提供完整的服务,用于提供IOC的解决方案.IOC被称为控制反转或者依赖注入(Dependency Injection). Windsor是Castle 的一个IOC容器.它构建于MicroKernel之上,功能非常之强大,能检测类并了解使用这些类时需要什么参数,检测类型和类型之间工作依赖性,并提供服务或者发生错误时提供预警的机制. 官网:http://www.castleproject.org 源码: http

【转】轻量级IOC框架:Ninject

原文地址:http://www.cnblogs.com/coolcode/archive/2009/11/10/Ninject.html   前言 前段时间看Mvc最佳实践时,认识了一个轻量级的IOC框架:Ninject.通过google搜索发现它是一个开源项目,最新源代码地址是:http://github.com/enkari/ninject/tree/master 用户向导:http://ninject.codeplex.com/wikipage?title=User%20Guide&ref

各大主流.Net的IOC框架性能测试比较

      在上一篇中,我简单介绍了下Autofac的使用,有人希望能有个性能上的测试,考虑到有那么多的IOC框架,而主流的有:Castle Windsor.微软企业库中的Unity.Spring.NET.StructureMap.Ninject等等.本篇文章主要针对这些IOC框架编写测试程序.   Autofac下载地址:http://code.google.com/p/autofac/ Castle Windsor下载地址:http://sourceforge.net/projects/ca

java轻量级IOC框架Guice

Guice是由Google大牛Bob lee开发的一款绝对轻量级的java IoC容器.其优势在于: 速度快,号称比spring快100倍. 无外部配置(如需要使用外部可以可以选用Guice的扩展包),完全基于annotation特性,支持重构,代码静态检查. 简单,快速,基本没有学习成本. Guice和spring各有所长,Guice更适合与嵌入式或者高性能但项目简单方案,如OSGI容器,spring更适合大型项目组织. 注入方式 在我们谈到IOC框架,首先我们的话题将是构造,属性以及函数注入

常用Flex IOC框架比较分析

IOC(Inversion of Control),也称DI(Dependency Injection),是近年来在软件开发中变得非常流行的一种设计策略.众多的Flex开 发者,探索出了诸如Spring ActionScript.Parsley.Flicc和Swiz这样的IOC框架. 什么是IOC?一言以蔽之,IOC是一种软件设计模式.借助IOC,可用一个独立的对象为其他对象的数据成员填充正确的实现,而不是由这些 对象自己负责此项工作.这样做的好处有两个.第一,可将对象的数据成员声明为接口,从而

OpenMP框架入门

OpenMP 框架是使用 C.C++ 和 Fortran 进行并发编程的一种强大方法.GNU Compiler Collection (GCC) V4.2 支持 OpenMP 2.5 标准,而 GCC 4.4 支持最新的 OpenMP 3 标准.包括 Microsoft? Visual Studio 在内的其他编译器也支持 OpenMP.在本文中,您可以学习使用 OpenMP 编译指示 (pragma),寻找对 OpenMP 提供的一些应用程序编程接口 (API) 的 支持,并使用一些并行算法对

ioc-android中IOC框架的缺点

问题描述 android中IOC框架的缺点 感觉现在AndroidIOC框架甚是流行 想了解下它的一些缺点

Java Mybatis框架入门基础教程_基础知识

一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去 设置参数和获取检索结果.MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素.Map接口和POJOs(普通java对象)到数据库中的记录. 二.MyBatis工作流程 (1)加载配置并初始化 触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个

PHP的Yii框架入门使用教程_php实例

安装 Yii 的安装由如下两步组成: 从 yiiframework.com 下载 Yii 框架. 将 Yii 压缩包解压至一个 Web 可访问的目录. Tip|提示: 安装在 Web 目录不是必须的,每个 Yii 应用都有一个入口脚本,只有它才必须暴露给 Web 用户.其它 PHP 脚本(包括 Yii)应该保护起来不被 Web 访问,因为它们可能会被黑客利用.需求 安装完 Yii 以后你也许想验证一下你的服务器是否满足使用 Yii 的要求,只需浏览器中输入如下网址来访问需求检测脚本: http: