Ioc依赖注入:Unity4.0.1 在项目中的应用 (MVC和API)
使用Unity的好处网上有很多,百度一下即可
这里引用了一篇关于面向接口编程的好处的文章作为引申:https://blog.csdn.net/Cyy19970527/article/details/83177996
在MVC中使用Unity
需要引用Unity包,我安装的版本为 Unity-4.0.1
尽管现在Unity最新版本已经更新到5.11.2了,但是在使用配置文件注入的时候,总是报以下错误,
百度查找到一篇文章说是版本问题: https://blog.csdn.net/weixin_34124577/article/details/93533679
接下来直接上测试代码:项目结构使用简单的三层结构
DAL层
namespace DAL
{
//声明一个接口层,获取名称
public interface IADao
{
string GetName();
}
} //实现1
public class A1Dao : IADao
{
public string GetName()
{
return "我叫A1";
}
} //实现2
public class A2Dao : IADao
{
public string GetName()
{
return "我叫A2";
}
}
BLL层
namespace BLL
{
//声明一个Bll层接口
public interface IA
{
string GetName();
}
} //实现1
public class A1 : IA
{
IADao _a1; //构造函数注入
[InjectionConstructor]
public A1(IADao a1)
{
_a1 = a1;
} public string GetName()
{
return _a1.GetName();
}
} //实现2
public class A2 : IA
{
//属性注入 "a2dao" 是区分两个不同实现的标识,在配置文件中声明该名称
[Dependency("a2dao")]
public DAL.IADao _a1 { get; set; } public string GetName()
{
return _a1.GetName();
}
}
在控制器中调用
public class HomeController : Controller
{
//通过属性注入
[Dependency("a2")]
public IA _a2 { get; set; } private IA _ia;
//构造函数注入
[InjectionConstructor]
public HomeController(IA ia) //如果都通过构造函数注入,则通过该方式区分([Dependency("a1")]IA a1,[Dependency("a2")]IA a2)
{
_ia = ia;
} public ActionResult Index()
{
ViewBag.Name = _ia.GetName(); //通过构造函数注入获取 ViewBag.A2Name = _a2.GetName(); //通过属性注入获取 return View();
}
}
显示结果:
接下来说如何配置
1,首先要引用Unity插件
2,然后在App_Start 文件夹下创建一个注册配置类UnityConfig (引用插件的时候会自动创建,自定义也可以),用来注册配置文件Unity.config中的配置,
/// <summary>
/// 配置文件公用类
/// </summary>
public class UnityConfig
{
/// <summary>
/// MVC注入 在全局方法中调用该方法,实现全局注册
/// </summary>
public static void Start()
{
var container = ApiContainer.GetUnityContainer();
RegisterTypes(container); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); //MVC注入
} /// <summary>
/// 使用配置文件注册
/// </summary>
/// <param name="container"></param>
private static void RegisterTypes(IUnityContainer container)
{
//使用单独的Unity.config配置文件
var filepath = HttpRuntime.AppDomainAppPath;
var context = HttpContext.Current;
if (context != null)
{
filepath = context.Server.MapPath("~/");
}
var getfile = filepath + "Unity.config";
var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = getfile };
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");
container.LoadConfiguration(unitySection, "defaultContainer"); //在App.config或者Web.Config中配置
//UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
//container.LoadConfiguration(section, "defaultContainer"); //或者section.Configure(container, "defaultContainer");
}
}
3,然后同样在App_Start 文件夹下创建一个UnityDependencyResolver 类,同时实现接口:IDependencyResolver
/// <summary>
/// 用于自动实现对象类
/// </summary>
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>();
}
}
}
4,写一个Unity公共类,也可以将该类集成到项目中
/// <summary>
/// Unity公共类
/// </summary>
public class ApiContainer
{
private readonly static IUnityContainer _container = null; /// <summary>
/// 初始化容器
/// </summary>
/// <returns></returns>
static ApiContainer()
{
//新建容器构建器,用于注册组件和服务
_container = new UnityContainer();
} /// <summary>
/// 对外开放函数 获取Unity容器
/// </summary>
/// <returns></returns>
public static IUnityContainer GetUnityContainer()
{
return _container;
} /// <summary>
/// 获取实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T GetServer<T>()
{
return _container.Resolve<T>();
} /// <summary>
/// 可以根据ConfigName获取实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="ConfigName">配置文件中指定的文字</param>
/// <returns></returns>
public static T GetServer<T>(string ConfigName)
{
return _container.Resolve<T>(ConfigName);
} /// <summary>
/// 返回构结函数带参数
/// </summary>
/// <typeparam name="T">依赖对象</typeparam>
/// <param name="ConfigName">配置文件中指定的文字(没写会报异常)</param>
/// <param name="parameterList">参数集合(参数名,参数值)</param>
/// <returns></returns>
public static T GetServer<T>(Dictionary<string, object> parameterList)
{
var list = new ParameterOverrides();
foreach (KeyValuePair<string, object> item in parameterList)
{
list.Add(item.Key, item.Value);
}
return _container.Resolve<T>(list.OnType<T>());
} }
5,在项目根目录下创建一个 Unity.config 文件,配置如下
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<containers>
<container name="defaultContainer">
<register type="BLL.IA,BLL" mapTo="BLL.A1, BLL"/>
<register type="BLL.IA,BLL" mapTo="BLL.A2, BLL" name="a2" />
<register type="DAL.IADao,DAL" mapTo="DAL.A1Dao, DAL"/>
<register type="DAL.IADao,DAL" mapTo="DAL.A2Dao, DAL" name="a2dao"/>
</container>
</containers>
</unity>
</configuration>
6,在全局中注册 Global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); UnityConfig.Start(); //全局注册 可通过构造函数or属性调用
}
}
到此全部结束
如果要在 WebAPI中使用Unity,则除了引用Unity插件,还要引用 Unity.WebApI 插件,引用版本如下:
然后需要调整一处地方,将MVC的注入方式换成WebAPI的注入方式,如下:
using System;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.WebApi;
using System.Web.Http;
namespace API.App_Start
{
/// <summary>
/// 配置文件公用类
/// </summary>
public class UnityConfig
{
public static void Start()
{
//DependencyResolver.SetResolver(new UnityDependencyResolver(container)); //MVC注入方式
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(GetConfiguredContainer()); //API注入方式
}
}
}
另外需要去掉上边代码中的 UnityDependencyResolver : IDependencyResolver 实现。API的不需要实现如下接口, 去掉如下图的实现。
其他的地方都一样。
参考文章:
https://www.cnblogs.com/qqlin/archive/2012/10/18/2720828.html
https://blog.csdn.net/hezheqiang/article/details/80255280
Ioc依赖注入:Unity4.0.1 在项目中的应用 (MVC和API)的更多相关文章
- 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入
系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...
- Spring学习-spring核心机制-IOC依赖注入
转载自:http://www.cnblogs.com/chenssy/archive/2012/11/11/2765266.html 今天复习一下spring两大特性之一:IOC依赖注入,看了一下大佬 ...
- IOC依赖注入简单实例
转自:http://hi.baidu.com/xyz136299110/item/a32be4269e9d0c55c38d59e6 相信大家看过相当多的IOC依赖注入的例子. 但大家在没有明白原理的情 ...
- ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便
初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通的.这是因为其使用了依赖注入 (DI) 的软件设计模式,代码的设计是遵循着“高内聚.低耦合”的原则, ...
- ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用
上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...
- ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用
话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...
- ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便(转载)
原文地址:https://www.cnblogs.com/Andre/p/9604759.html 初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通 ...
- springboot启动流程(九)ioc依赖注入
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 在前面的几篇文章中,我们多次提到这么一个转化过程: Bean配置 --> Bean ...
- Spring-DI控制反转和IOC依赖注入
Spring-DI控制反转和IOC依赖注入 DI控制反转实例 IDEAJ自动导入Spring框架 创建UserDao.java接口 public interface UserDao { public ...
随机推荐
- php 安装扩展插件实例-ftp.so
工作记录一下 1.首先进入原始php包安装文件(不是安装后的文件,是下载php安装压缩包,解压后的那个文件)安装包里有个扩展文件夹ext,进入 #cd /home/php-5.3.3/ext/#l ...
- U盘模式无法引导进入pe系统
有些笔记本.一体机 特别是win8.win10系统维护时需要 通过u盘进入pe系统,就是进不去,需要到bios中更改一下设置. 1.首先我们将已经使用u启动u盘启动盘制作 ...
- NOIP幂次方
#include<stdio.h> ] = { ,,,,,,,,,,,,,,, };//由题意n最大为20000,所以最多会用到2的14次方 //为了防止mid+1出错,故写到15次方 i ...
- Navicat 导入数据时报Incorrect datetime value: '0000-00-00 00:00:00.000000' 错误
今天重装了个系统,装好MySQL和Navicat之后导入SQL时报了Incorrect datetime value: '0000-00-00 00:00:00.000000' 错误, 查了资料说是m ...
- js 常用总结
1.截取字符串 var a="/s/d"; console.log(a.substr(0,a.indexOf("/",1))) // 得到/s 2. // ...
- python len函数(41)
在python中除了print函数之外,len函数和type函数应该算是使用最频繁的API了,操作都比较简单. 一.len函数简介 返回对象的长度(项目数)参数可以是序列(例如字符串str.元组tup ...
- C#中 ref 关键字的认识和理解
之前接手老项目的时候有遇到一些的方法参数中使用了ref关键字加在传参的参数前面的情况.对于新手,这里介绍和讲解一下ref的用法和实际效果. CLR中默认所有方法的参数传递方式都是传值,也就是说不管你传 ...
- Tomcat 项目部署、账户配置、状态监测
tomcat部署项目 方式一.自动部署(最常用) 直接把war包或部署的文件夹放到webapps下. tomcat启动后会自动监听webapps下的文件|目录,放入打包好的项目会自动部署,移除打包好的 ...
- centos安装gitlab及汉化
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务.今天,就记录一下centos部署gitlab及其汉化的操作方法. 1.下载安装 下载地址: ...
- 【daily】Java枚举 - fastjson对enum的处理
目的 1.枚举值转换成完全的json: 2.对象中的枚举成员完全转换成json: 3.枚举类的全部值转换成json: 枚举定义 public enum SongsEnum { SAFE_AND_SOU ...