在 MVC 控制器中使用 构造函数时行依赖注入 (IoC)
在 Controller 中使用 构造函数进行依赖注入 (IoC)
1. Controller 代码:
ICard card;
ICardCategory cardCategory;
public CardController(ICard card, ICardCategory cardCategory)
{
this.card = card;
this.cardCategory = cardCategory;
}
接口 ICard , ICardCateogry 是一个普通的接口,没有继承或实现任何接口,而需要做的就是在 Gloable.cs 文件中解析依赖, 为了方便复用,将解析依赖封装成一个类,然后在 Gloable.cs 文件中注册,在这个示例中,使用的是 Unity 进行依赖注入,完整的代码如下:
using Microsoft.Practices.Unity;
using System;
using System.Collections.Generic;
//using System.Web.Http.Dependencies;
using System.Web;
using System.Web.Mvc; namespace SnsManage.Resolver
{
/// <summary>
/// Dependency Injection Resolver Container
/// </summary>
public class UnityResolver : IDependencyResolver
{
protected IUnityContainer container; public UnityResolver(IUnityContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
this.container = container;
} public object GetService(Type serviceType)
{
try
{
return container.Resolve(serviceType);
}
catch (ResolutionFailedException)
{
return null;
}
} public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return container.ResolveAll(serviceType);
}
catch (ResolutionFailedException)
{
return new List<object>();
}
} //public IDependencyScope BeginScope()
//{
// var child = container.CreateChildContainer();
// return new UnityResolver(child);
//} //public void Dispose()
//{
// container.Dispose();
//} //private const string HttpContextKey = "perRequestContainer"; //private readonly IUnityContainer container; //public UnityResolver(IUnityContainer container)
//{
// this.container = container;
//} //public object GetService(Type serviceType)
//{
// if (typeof(IController).IsAssignableFrom(serviceType))
// {
// return ChildContainer.Resolve(serviceType);
// } // return IsRegistered(serviceType) ? ChildContainer.Resolve(serviceType) : null;
//} //public IEnumerable<object> GetServices(Type serviceType)
//{
// if (IsRegistered(serviceType))
// {
// yield return ChildContainer.Resolve(serviceType);
// } // foreach (var service in ChildContainer.ResolveAll(serviceType))
// {
// yield return service;
// }
//} //protected IUnityContainer ChildContainer
//{
// get
// {
// var childContainer = HttpContext.Current.Items[HttpContextKey] as IUnityContainer; // if (childContainer == null)
// {
// HttpContext.Current.Items[HttpContextKey] = childContainer = container.CreateChildContainer();
// } // return childContainer;
// }
//} //public static void DisposeOfChildContainer()
//{
// var childContainer = HttpContext.Current.Items[HttpContextKey] as IUnityContainer; // if (childContainer != null)
// {
// childContainer.Dispose();
// }
//} //private bool IsRegistered(Type typeToCheck)
//{
// var isRegistered = true; // if (typeToCheck.IsInterface || typeToCheck.IsAbstract)
// {
// isRegistered = ChildContainer.IsRegistered(typeToCheck); // if (!isRegistered && typeToCheck.IsGenericType)
// {
// var openGenericType = typeToCheck.GetGenericTypeDefinition(); // isRegistered = ChildContainer.IsRegistered(openGenericType);
// }
// } // return isRegistered;
//}
}
}
然后在 App_Start 文件中添加一个配置类, UnityConfig.cs, 其中的代码如下:
public static class UnityConfig
{
/// <summary>
/// Dependency Injection
/// </summary>
public static void RegisterComponents()
{
var container = new UnityContainer(); // register all your components with the container here
// it is NOT necessary to register your controllers // e.g. container.RegisterType<ITestService, TestService>(); container.RegisterType<IUser, UserService>( new HierarchicalLifetimeManager()); DependencyResolver.SetResolver(new UnityResolver(container)); }
}
最后在 Global.asax 文件中注册
UnityConfig.RegisterComponents();
在 MVC 控制器中使用 构造函数时行依赖注入 (IoC)的更多相关文章
- MVC控制器中动作方法返回的结果
在MVC控制器中主要的返回方式有如下几种: 1.Content(): 返回文本类型的ContentResult,比如“这是我做的一个MVC”. 2.File(): 返回文件类型的内容FileResul ...
- AngularJs调用NET MVC 控制器中的函数进行后台操作
题目中提到的控制器指的是.NET MVC的控制器,不是angularjs的控制器. 首先看主页面的代码: <!DOCTYPE html> <html> <head> ...
- 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入
系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...
- 剑指架构师系列-Struts2构造函数的循环依赖注入
Struts2可以完成构造函数的循环依赖注入,来看看Struts2的大师们是怎么做到的吧! 首先定义IBlood与BloodImpl类: public interface IBlood { } pub ...
- Spring中的控制反转和依赖注入
Spring中的控制反转和依赖注入 原文链接:https://www.cnblogs.com/xxzhuang/p/5948902.html 我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达 ...
- 轻松了解Spring中的控制反转和依赖注入(二)
紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...
- 大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC
转发时请注明原创作者及地址,否则追究责任.原创:alunchen 在上一篇文章中,我们聊了很多关于定义的方面,比较孤燥,下面我们结合.Net Core聊一下依赖注入&控制反转. 三种对象生 ...
- asp.net MVC控制器中返回JSON格式的数据时提示下载
Asp.net mvc在接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如下: 视图中js代码: $("# ...
- 在IE中MVC控制器中返回JSON格式的数据时提示下载
最近做项目时,视图中用jquery.form.js异步提交表单时,接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如 ...
随机推荐
- .net下MD5算法和加盐
MD5方法: public static string GetMD5(string sDataIn) { MD5CryptoServiceProvider md5 ...
- DHCP协议讲解
一.DHCP服务介绍: DHCP为动态主机配置协议,该协议能自动配置主机的IP地址.子网掩码.网关及DNS服务器等TCP/IP信息.DHCP可以降低客户机IP地址配置的复杂度和网络管理成本. DHCP ...
- C++ 11中的右值引用以及std::move
看了很多篇文章,现在终于搞懂了C++ 中的右值以及std::move 左值和右值最重要的区别就是右值其实是一个临时的变量 在C++ 11中,也为右值引用增加了新语法,即&& 比 ...
- 黄聪:PHP 免费获取手机号码归属地(转)
一.淘宝网API API地址: http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443 参数: tel:手机号码 返回 ...
- de.greenrobot.event.EventBusException: Subscriber class dji.midware.a.e already registered to event class
java.lang.RuntimeException: Unable to create application com.android.tools.fd.runtime.BootstrapAppli ...
- PLSQL_Oracle物化视图Material View的基本概念和用法 (概念)
2014-06-08 Created By BaoXinjian
- HDU 1671 Phone List (Trie·数组实现)
链接:http://blog.csdn.net/acvay/article/details/47089657 题意 给你一组电话号码 判断其中是否有某个电话是另一个电话的前缀 字典树的基础应用 ...
- CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)
转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interestin ...
- C++学习24 虚析构函数
在C++中,构造函数用于在创建对象时进行初始化工作,不能声明为虚函数.因为在执行构造函数前对象尚未创建完成,虚函数表尚不存在,也没有指向虚函数表的指针,所以此时无法查询虚函数表,也就不知道要调用哪一个 ...
- [ActionScript3.0] 逻辑或"||=" ,等于"=="和全等于"==="
function a(o:Object):void { o||=new Object(); trace(o); } //此上下两个方法作用是一样的 function b(o:Object):void ...