Unity IOC注入详细配置(MVC,WebApi)

一直想写一篇关于unity 详细的配置信息的文章,也算是自我总结吧

先介绍了unity , Unity是微软官方推荐使用的轻型的IOC框架,支持各种方式的注入 ,使用来解耦的利器.

获取unity 的方式呢你可以直接下载对应的dll文件或者去对应的网站下载,我个人推荐呢用NuGet直接添加和管理.

添加方式如下图

安装之后呢会自动添加到项目里,当有更新的时候,直接在窗口里面更新就行,或者执行命令行 Update-Package  Mvc{tab}

,如果你只需要注入普通的MVC的话那现在啊就可以了。但是如果你可能还需要注入webapi的话那么你就还需要引入这个库

磨刀不误砍柴工,包准备好了现在可以开始配置了,

总的来说unity的配置分为3步

1:填写配置文件指定映射关系

2:创建容器载入配置文件

3:构造注入或者属性注入。

完成了这几步呢就可以开始使用了

先说配置文件吧。先发个图看看完整的结构

其实看这很负责用起来的话不是这样,如果你只是简单来用的话其实就只需要关注5个节点

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity>

    <alias alias="IClass" type="IservicesVc.test, IservicesVc" />
    <alias alias="MyClass" type="Services.test, Services" />

    <namespace name="IservicesVc.test" />
    <namespace name="Services.test" />

    <assembly name="IservicesVc" />
    <assembly name="Services" />
    <container>

      <register type="Itesttwo" mapTo="testtwo" />
      <register type="ITestIoc" mapTo="TestIo" />
    </container>
  </unity>
</configuration>

从上往下看呢首先<alias>节点用来指定程序集之间的映射关系 alias是表示节点的别名,type是指定类型用的 "结构为命名空间+文件名,命名空间",,<namespace>用来指定引用程序集的命名空间 name属性=命名空间+文件夹名称(如果是多个映射),<assembly > name="程序命名空间" 用来指定引用的程序集

<container> 就是容器节点了。里面的<register>节点用来用的类之间的映射关系,type="需要映射的类型",mapto="映射的目标类型" 下面贴下对应的代码

namespace IservicesVc.test
{
    public interface ITestIoc
    {
        int sum(int sumone, int sumtwo);

    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IservicesVc.test
{
    public interface Itesttwo
    {
        int count(int i, int j);
    }
}
using IservicesVc.test;

namespace Services.test
{
    public class TestIo :ITestIoc
    {
      public  int sum(int sumone, int sumtwo)
      {
          return sumone + sumtwo;

      }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IservicesVc.test;
using Microsoft.Practices.Unity;

namespace Services.test
{
 public   class testtwo:Itesttwo

    {
     [Dependency]
     public ITestIoc ii { get; set; }
     public int count(int i, int j)
     {
         var sum = ii.sum(i,j);
         return sum * sum;

     }
    }
}

配置完成后呢。就是需要开始注册了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using TestUnityIocVC.App_Start;

namespace TestUnityIocVC
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            GlobalConfiguration.Configure(WebApiConfig.Register);

            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            //注入方法
            Bootstrapper.Initialise();
        }
    }
}

重点是Bootstrapper.Initialise();方法

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using IservicesVc.test;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using Services.test;
using Unity.WebApi;

namespace TestUnityIocVC.App_Start
{
    public static class Bootstrapper
    {
        public static void Initialise()
        {
            //UnityContainer container = new UnityContainer();
            //UnityConfigurationSection configuration = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection;
            //configuration.Configure(container, "defaultContainer");
            var container = BuildUnityContainer();
            DependencyResolver.SetResolver(new UnityDependencyResolver(container));//MVC注入

           //GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);//MVC
            GlobalConfiguration.Configuration.DependencyResolver = new  Unity.WebApi.UnityDependencyResolver(container);//WebAPi注入
        }

        /// <summary>
        /// Builds the unity container.
        /// </summary>
        /// <returns></returns>
        private static IUnityContainer BuildUnityContainer()
        {
            var container = new UnityContainer();
            //container.RegisterType<INodeBiz, NodeBiz>();
            var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = HttpContext.Current.Server.MapPath("~/Unity.config") };
            Configuration configuration =
                ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
            var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");
            container.LoadConfiguration(unitySection);
            //container.RegisterType<ITestIoc, TestIo>();
            return container;
        }
    }
}

通过BuildUnityContainer方法构造容器, 容器的结构是从配置文件的读取的,但是现在你如果运行会报错为什么呢,因为你如果需要MVC注入的话还需要一些别的处理.

我们要实现MVC3中新提供 的两个接口:IDependencyResolver和IControllerActivator

IDependencyResolver公开两个方法 - GetService的GetServices.The GetService方法解决了单独注册的服务,支持任意对象的创建,GetServices解决注册多个服务。IDependencyResolver接口的实现应该委托给底层的依赖注入容器提供注册服务请求的类型。当有没有注册的服务请求的类型,ASP.NET MVC框架预计这个接口的实现返回GetService为空,并从GetServices返回空集合。让我们以统一提供依赖注入工作IDependencyResolver intreface派生创建一个自定义的依赖解析器类。

我们定义一个类名为UnityDependencyResolver:

using System;
using System.Collections.Generic;
using System.Web.Mvc;
using Microsoft.Practices.Unity;

namespace TestUnityIocVC
{
    public class UnityDependencyResolver : IDependencyResolver
    {
        IUnityContainer container;
        public UnityDependencyResolver(IUnityContainer container)
        {
            this.container = container;
        }

        public object GetService(Type serviceType)
        {
            try
            {
                return container.Resolve(serviceType);
            }
            catch
            {
                return null;
            }
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            try
            {
                return container.ResolveAll(serviceType);
            }
            catch
            {
                return new List<object>();
            }
        }
    }
}

实现两个方法GetService和GetServices。使用Unity容器返回我们需要的Service或者ojbect。

实现两个方法GetService和GetServices。使用Unity容器返回我们需要的Service或者ojbect。

ASP.NET MVC 3以后的版本已经推出了一个新的接口IControllerActivator,让您激活与自定义的行为控制器,并且可以使用依赖注入.让我们创建一个派生自IControllerActivator 接口的一个自定义的控制器

Icontroller

using System;
using System.Web.Mvc;

namespace TestUnityIocVC
{
    public class CustomControllerActivator : IControllerActivator
    {
        IController IControllerActivator.Create(System.Web.Routing.RequestContext requestContext,
            Type controllerType)
        {
            return DependencyResolver.Current
                .GetService(controllerType) as IController;
        }
    }
}

到这。整个注册就完成了

那么在MVC 的控制器和webapi中就可以用了

(MVC)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using IservicesVc;
using IservicesVc.test;
using Microsoft.Practices.Unity;
using Services.test;

namespace TestUnityIocVC.Controllers
{
    public class HomeController : Controller
    {

        //属性注入;
        [Dependency]
        public ITestIoc _TestIoc { get; set; }

        public Itesttwo test = DependencyResolver.Current.GetService<Itesttwo>();
        //private readonly ITestIoc _testIoc;

        //public HomeController(ITestIoc testIoc)
        //{
        //    _testIoc = testIoc;
        //}

        public ActionResult Index()
        {
            var count = _TestIoc.sum(10, 20);
            ViewBag.Title = "home";

            return View();
        }
    }
}

(WEBapi)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using IservicesVc.test;

namespace TestUnityIocVC.Controllers.Api
{
    public class testController : ApiController
    {
        private readonly Itesttwo _testIoc;
        public testController(Itesttwo testIoc)
        {
            _testIoc = testIoc;

        }

        public IEnumerable<string> Get()
        {
            var sum = _testIoc.count(10, 20);
            return new string[] { "value1", sum.ToString() };
        }
    }
}

。好了到这整个流程就算是结束了。这是本人第一次写博客。有些用语不合适或者描述的不清楚的地方请谅解。

Unity IOC注入详细配置(MVC,WebApi)

时间: 2024-10-26 01:18:58

Unity IOC注入详细配置(MVC,WebApi)的相关文章

Net Unity IOC注入总结

简介 Unity 应用程序块(Unity)是一个轻量级.可扩展的依赖注入容器,支持构造函数.属性和方法调用注入.它为开发人员提供了如下好处: 简化了对象的创建,尤其是分层的对象结构和依赖. 允许开发人员在运行时或者配置中指定依赖的需求抽象,以及简化了横切关注点的管理. 服务定位功能允许客户代码保存或者缓存容器.这在开发人员可以持久化容器到 ASP.NET Session 或者 Application 中的 ASP.NET Web 应用程序中特别有用. 配置文件(1)简单register方式 <?

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

网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下: unityContainer = new UnityContainer(); //实例化一个容器 unityContainer.RegisterType<IClassTest, ClassTest>(); //注册类型映射 unityContainer.Resolve<IClassTest>();//解析并获取类型的实例 然而实际

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

网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下 unityContainer = new UnityContainer(); //实例化一个容器 unityContainer.RegisterType<IClassTest, ClassTest>(); //注册类型映射 unityContainer.Resolve<IClassTest>();//解析并获取类型的实例 然而实际情

Unity IoC Base On MVC

Unity框架,是一个经典的IoC模式实现方式,其通过config文件配置section,将接口与实现解藕,config中的section配置的container以全名称对应,使得应用程序无需像Ninject方式那样,依赖接口项和实现项,因其解藕的配置,能让应用程序实现静态更新服务的效果,即不退出应用程序更新服务的功能. 下面是Unity的实现,其核心接口IUnityContainer是Unity模式实现的基础,在Controller生命周期中IUnityContainer起到传递section

Spring注入,Ioc的具体配置

Spring框架的IOC注入: 一.Java部分代码: Person实体类: 1 package com.ioc; 2 3 import java.util.List; 4 import java.util.Map; 5 import java.util.Properties; 6 import java.util.Set; 7 8 import com.adviceAop.Dancer; 9 import com.aop.Singer; 10 11 /** 12 * Spring 各种类型的注

构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)

前言: 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(65)-MVC WebApi 用户验证 (1) 回顾上一节,我们利用webapi简单的登录并进行了同域访问与跨域访问来获得Token,您可以跳转到上一节下载代码来一起动手. 继续上一篇的文章,我们接下来演示利用拿到的Token来访问接口,管理接口,利用系统权限管理接口,对每个接口进行授权(管理接口为选读部分,因为你需要阅读最开始权限管理部分(18-27节),才能阅读这部分) 开发环境: V

.NET 用 Unity 依赖注入&mdash;&mdash;注册和解析类型

Unity Unity Application Block (Unity)是一个轻量级的,可扩展的依赖注入容器,它支持构造函数注入,属性注入和方法调用注入.它为开发人员提供了以下优点: 提供简化的对象创建,特别是层级对象结构和依赖,简化应用程序代码: 支持需求抽象:这可以让开发者在运行时或是配置文件指定依赖,简化横切关注点(crosscutting concerns)的管理: 通过延迟组件配置到容器,增加了灵活性: 具有服务定位器功能:这可以让客户存储或缓存容器.对 ASP.NET Web 应用

ASP.NET Core MVC/WebAPi 模型绑定探索

前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用到了,你再去看理论性的文章时才会豁然开朗,这是我一直以来学习技术的方法.本文我们来讲解.NET Core中的模型绑定. 话题 在ASP.NET Core之前MVC和Web APi被分开,也就说其请求管道是独立的,而在ASP.NET Core中,WebAPi和MVC的请求管道被合并在一起,当我们建立控

Unity 依赖注入

关于Ioc的框架有很多,比如astle Windsor.Unity.Spring.NET.StructureMap,我们这边使用微软提供的Unity做示例,你可以使用Nuget添加Unity,也可以引用Microsoft.Practices.Unity.dll和Microsoft.Practices.Unity.Configuration.dll,下面我们就一步一步的学习下Unity依赖注入的详细使用.如果不明白什么是控制反转和依赖注入,请参考控制反转和依赖注入模式 下面通过一个示例来讲解Uni