在 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中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如 ...
随机推荐
- update openssl on redhat/centos
$ openssl versionOpenSSL 1.0.1e-fips 11 Feb 2013 $ yum list |grep opensslopenssl.x86_64 1.0.1e-16.el ...
- C#调用MySql
1.要连接MySql数据库必须首先下载MySql官方的连接.net的文件,文件下载地址为http://dev.mysql.com/downloads/connector/net/6.6.html#do ...
- 151. Reverse Words in a String
Given an input string, reverse the string word by word. For example,Given s = "the sky is blue& ...
- 黄聪:URL推广系统防作弊
要实现的功能: 1.注册用户登录以后可以获取到个人私人唯一的一个推广链接,通过主动传播带来的注册用户全部计入该ID名下:2.其中与该ID相同cookies或者同IP的注册量全部作为作弊处理(也就是说不 ...
- JVM如何理解Java泛型类(转)
一个很典型的泛型(generic)代码.T是类型变量,可以是任何引用类型: public class Pair<T>{ private T first=null; private T se ...
- __VA_ARGS__用法(转)
自定义调试信息的输出 调试信息的输出方法有很多种, 例如直接用printf, 或者出错时使用perror, fprintf等将信息直接打印到终端上, 在Qt上面一般使用qDebug,而守护进程则一 ...
- POJ_1287_mst
Networking Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6432 Accepted: 3488 Descri ...
- 实现图片的2次缩放后再进行candy边缘检测
//实现图片的2次缩放后再进行candy边缘检测//Author:SD//Date:2015-9-27#include "cv.h"#include "highgui.h ...
- laravel判断HTTP请求是否ajax
if(Request->ajax()){ echo "AJAX"; }else{ echo '普通请求':}
- Java多线程之后台线程不执行finally
后台线程不执行finally package wzh.daemon; import java.util.concurrent.TimeUnit; class ADaemon implements Ru ...