AutoFac的工作原理就是:注册类并映射到接口,通过注入后返回相应实例化的类

先来简单介绍下Autofac的使用

     1、通过Nuget或代码安装autofac

安装autofac :install-package autofac

安装对mvc4的支持:install -package autofac.mvc4

     2、新建相应的类及接口,并在autofac中进行映射

2.1、新建接口 INewsHelper

 namespace test.Interface
{
public interface INewsHelper
{
string GetNewInfo(int id);
}
}

2.2、新建类NewsHelper并继承INewsHelper

 namespace test.Helper
{
public class NewsHelper:INewsHelper
{
public string GetNewInfo(int id)
{
return "newshelper";
}
}
}

2.3 新建类SubjectHelper并继承INewsHelper

 namespace test.Helper
{
public class SubjectHelper:INewsHelper
{
public string GetNewInfo(int id)
{
return "subjecthelper";
} }
}  

2.4 在autofac中注册并映射

 namespace test
{
// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
// 请访问 http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
var builder = new ContainerBuilder();
builder.RegisterType<CategoryHelper>().As<ICategoryHelper>().InstancePerHttpRequest(); builder.RegisterType<NewsHelper>().Named<INewsHelper>("news");
builder.RegisterType<SubjectHelper>().Named<INewsHelper>("subject"); builder.RegisterControllers(Assembly.GetExecutingAssembly());
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
}
}
} 

3、新建ServiceGetter类及  IServiceGetter接口

3.1

 namespace test.Interface
{
public interface IServiceGetter
{
T GetByName<T>(string name);
}
}  

3.2

 namespace test.Helper
{
public class ServiceGetter:IServiceGetter
{
public T GetByName<T>(string name)
{
return AutofacDependencyResolver.Current.RequestLifetimeScope.ResolveNamed<T>(name);
}
}
}

3.3 增加注册

builder.RegisterType<ServiceGetter>().As<IServiceGetter>();

整个步骤3做了一件事,给中间件一个泛型的name,由中间件向autofac将相应的class的实例并返回,说白了就是干了下面这句代码的事:

     AutofacDependencyResolver.Current.RequestLifetimeScope.ResolveNamed<INewsHelper>("news");

4、通过构造函数进行注入

 namespace test.Controllers
{
public class HomeController : Controller
{ private IServiceGetter getter; public HomeController(IServiceGetter getter)
{ this.getter = getter; } public ActionResult Index()
{ ViewBag.Message = getter.GetByName<INewsHelper>("subject").GetNewInfo();
return View();
} }
}

Q:为什么没有在HomeController的构造函数中直接就取回呢?

A:因为这个时候我们还不知道具体需要哪个实例,所以要在需要的时候通过getter再取回来。

这样就完成了整个对于一个接口多个实现并定义多个Name的情况下,如何通过构造函数注入的方式来实现。

看下实际的效果:

情况1:

效果1:

情况2:

效果2:

转载链接:https://www.cnblogs.com/fuyujian/p/4115474.html

AutoFac在项目中应用的体会的更多相关文章

  1. Autofac在项目中应用的体会,一个接口多个实现的情况

    在本人接触的项目中Autofac应用的比较多一些,我理解的他的工作原理就是  注册类并映射到接口,通过注入后返回相应实例化的类! 下面说说我在项目中的实际应用 先来简单介绍下Autofac的使用 1. ...

  2. AutoFac在项目中的应用

    技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCode ...

  3. Redis的安装以及在项目中使用Redis的一些总结和体会

    第一部分:为什么我的项目中要使用Redis 我知道有些地方没说到位,希望大神们提出来,我会吸取教训,大家共同进步! 注册时邮件激活的部分使用Redis 发送邮件时使用Redis的消息队列,减轻网站压力 ...

  4. 转:C++项目中的extern "C" {}

    引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __c ...

  5. C++项目中的extern "C" {}

    from:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html C++项目中的extern "C" {} 20 ...

  6. 新的MOVE结构,和在项目中实际的感受

    关于MVC/MVP的瑕疵 MVC 和 MVP是最简单,最脍炙人口的框架结构. 有一段时间, 凡事有一定规模的代码,我都会架在上面,甚至后台程序也不例外(预留出可以注册的用户交互接口,作为后台控制器). ...

  7. jQuery在项目中的应用

    版权声明:本文为博主原创文章,未经博主允许不得转载.(转载需注明出处 http://www.cnblogs.com/yanfei1819/p/7743661.html) [摘要]   最近在项目中应用 ...

  8. 我是如何在公司项目中使用ESLint来提升代码质量的

    ESLint:你认识我吗 ESLint是一个语法规则和代码风格的检查工具. 和学习所有编程语言一样,想要入门ESLint,首先要去它的官网看看:https://eslint.org/. ESLint的 ...

  9. 编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理

    原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下! 文章宗旨:Talk is cheap show me the code. 大成若缺,其 ...

随机推荐

  1. jzoj5928

    tj:題解裡公式是錯的 我們可以考慮每一個節點[a,a+2^b-1]對答案的貢獻 則當這個節點是左兒子時,貢獻為2^b 是右兒子時,貢獻為2n−a−2b+12^n-a-2^b+12n−a−2b+1 左 ...

  2. 欢迎使用CSDN-markdown编辑器u

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

  3. Sublime Text shift+ctrl妙用(转载)

    1 :按住shift+ctrl然后按←或→可快速选中一行中的某一部分,相当于双击鼠标选中. 当你想在代码末尾加注释的话,这个方法很好用 输入文字->光标移到文字末尾->按住shift+ct ...

  4. 【4】JMicro微服务-服务限流

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 通过配置SMethod的maxSpeed属性实现服务限流,单位是个/每秒(qps),也就是服务方法每秒允许接收的最大请求个数 ...

  5. win7安装docker报错:error during connect: Get http ..... the system cannot find the file specified

    因为是win7 所以使用了官方网站的dockertoolbox 安装一路顺利,结果启动就报上面的错误, 因为安装包附带安装了virtualbox 上面的错误后来排查出来是 virtualboox的问题 ...

  6. JVM-Java GC分析

    如何获取JavaGC日志 用动态命令查看: jstat -gc 1262 2000 20  每隔20秒输入一次日志,总共输入20次 设置GC参数打印出日志 -XX:+PrintGC 输出GC日志 -X ...

  7. 【转】Ext JS 集合1713个icon图标的CSS文件

    原文:http://extjs.org.cn/node/715 由于最近在研究Extjs4.1.1,没想到Extjs没有自带的iconCls所使用的图标样式css,就是用那个写那个的,纠结了半天,网上 ...

  8. ELK日志系统之使用Rsyslog快速方便的收集Nginx日志

    常规的日志收集方案中Client端都需要额外安装一个Agent来收集日志,例如logstash.filebeat等,额外的程序也就意味着环境的复杂,资源的占用,有没有一种方式是不需要额外安装程序就能实 ...

  9. php的一个验证邮箱的正则表达式

    /([a-z0-9]*[-_\.]*[a-z0-9]+)*[-_\.]*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.]([a-z0-9]{2,3}|[a-z0-9]*[-_]?[a-z ...

  10. Nodejs学习笔记(七)—Node.js + Express 构建网站简单示例

    前言 上一篇学习了一些构建网站会用到的一些知识点:https://www.cnblogs.com/flyingeagle/p/9192936.html 这一篇主要结合前面讲到的知识,去构建一个较为完整 ...