系列目录
前言:
有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说 WebApi是目前首选
本节记录 MVC WebApi怎么利用Unity注入。系列开头已经讲解了普通的 MVC如何用Unity注入容器
不明白什么是IOC,DI,控制反转的自行百度补脑,否则无法阅读本文
其实这也是一次技术上的记录,因为找遍大百度居然没有可以用的利用Unity注入的WebApi!感谢随风朋友的提醒。才能完成本节的指导
为了更好的理解,请下载代码
链接:/s/1QjKHPbyNELrrZhuM3JD0dA 密码:lv1f
(这是一个已经包含了Unity注入的普通MVC例子)包含4个需要被注入的类库,BLL,IBLL,DAL,IDAL
开发工具:VS+SQL(数据库不是必要)
开始:
1.新建 MVC WebApi项目
2.安装Unity.WebApi程序包解析一下,这里有依赖项:Unity >=4.0.1
(我们之前的注入就只安装了Unity)所以Unity.WebApi是需要Unity4.0.1支持的。
安装Unity.WebApi会自动安装很多依赖项:Unity (≥ 4.0.1),CommonServiceLocator,Microsoft.AspNet.WebApi.Core,Microsoft.AspNet.WebApi.Client ,Newtonsoft.Json
网络不好会很漫长,需要难心等待。或者到nuget官方下载离线的
3.Apps.Core也需要同样安装Untiy.WebApi
安装完成后在Apps.WebApi下将自动多出一个文件
添加代码到UnityConfig.cs
using Apps.Core;using Microsoft.Practices.Unity;using System.Web.Http;using Unity.WebApi;namespace Apps.WebApi{public static class UnityConfig{public static void RegisterComponents(){UsingUnityContainer.Init();DependencyRegisterType.Container_Sys(ref UsingUnityContainer._container);GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(UsingUnityContainer._container);}}}
最后添加UnityConfig.RegisterComponents();到Global.asax 。必须在全局文件添加,本注入是运行时注入
using Apps.Core;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;namespace Apps.WebApi{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);UnityConfig.RegisterComponents();}}}
4.修复错误
运行之后会出现错误
这是由于Web.config节点缺乏解析造成。
需要添加以下节点
<dependentAssembly><assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" /></dependentAssembly><dependentAssembly><assemblyIdentity name=".Http.Formatting" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" /></dependentAssembly>
运行之后就没有问题了。
在Home/Index.cshtml编写一个简单的请求的测试一下
<script src="~/Scripts/jquery-1.10.2.min.js"></script><script>$(function(){$.get("/Api/Values/5",function(data){alert(data);});});</script>
5.运行并调试
添加控制反转代码到ValuesController
[Dependency]public ISysPersonBLL m_BLL { get; set; }
这样我们就可以用m_BLL来访问BLL的方法,达到控制反转的目的
如果断点执行到调用处,那么恭喜你,注入顺利成功,可以调用了(配图为返回数据库第一条数据的ID,数据和脚本在源码下载查看)
可以顺利访问到数据库