在 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中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如 ...
随机推荐
- Linux下的NTP
一.电脑时间的误差众 所周知,电脑主机的时间是根据电脑晶振以固定频率振荡,从而产生的.由于晶振的不同,会导致电脑时间与UTC时间 (全球标准时间:全球标准时间指的是由世界时间标准设定的时间.原先也被称 ...
- [git]Git常用命令
转自:http://www.cnblogs.com/idche/archive/2011/07/05/2098165.htmlGIT 学习笔记 集中化的版本控制系统 CVCS(Centralized ...
- java定时器和多线程实践记录
这几天因为需要测试mongodb读写分离的问题,因此写了个定时查询程序,并且用到了多线程,以达到定时启动多个线程查询数据库的效果,下边代码记录备忘: package timmer; import ja ...
- Android五:Activity
生命周期: onCreate onStart onResume onPause:在该状态如果有优先级更高的程序,那此进程可能被kill;如果是被重新执行,则回到onResume状态. onStop : ...
- 黄聪:如何用Jquery或者插件解除网页禁用右键复制的限制(转)
1.随便打开一个网址,放到收藏夹中. 2.复制下面的代码,替换原来网址的URL 选中复制以下代码 javascript:(function(){var doc=document;var bd=doc. ...
- (C#) Action, Func, Predicate 等泛型委托
(转载网络文章) (1). delegate delegate我们常用到的一种声明 Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型. 例:public del ...
- [Android Exception A] – 1-The following classes could not be instantiated
http://stackoverflow.com/questions/26575815/the-following-classes-could-not-be-instantiated-android- ...
- Android开发问题笔记
1.Toolbar问题:最低版本15,必须使用support,才能使用Toolbar,Toobar是5.0引入的 2.BottomTab:这个用TabLayout解决了 3.后端API最好采用一个成熟 ...
- [HTMLDOM]onmousedown、onmouseup 以及onclick事件触发顺序
摘自w3school:http://www.w3school.com.cn/htmldom/dom_events.asp onmousedown.onmouseup 以及 onclick 事件是鼠标点 ...
- centos利用cloudflare的bpf-tools实现ddos防护
概念 利用BPF( Berkeley Packet Filter)工具集结合iptables的xt_bpf模块可以实现高性能包过滤,从而应对大规模的ddos攻击.BPF Tools包含一组简单的pyt ...