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

先来简单介绍下Autofac的使用

     1、通过Nuget或代码安装autofac

安装autofac :install-package autofac

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

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

2.1、新建接口 INewsHelper

  1. namespace test.Interface
  2. {
  3. public interface INewsHelper
  4. {
  5. string GetNewInfo(int id);
  6. }
  7. }

2.2、新建类NewsHelper并继承INewsHelper

  1. namespace test.Helper
  2. {
  3. public class NewsHelper:INewsHelper
  4. {
  5. public string GetNewInfo(int id)
  6. {
  7. return "newshelper";
  8. }
  9. }
  10. }

2.3 新建类SubjectHelper并继承INewsHelper

  1. namespace test.Helper
  2. {
  3. public class SubjectHelper:INewsHelper
  4. {
  5. public string GetNewInfo(int id)
  6. {
  7. return "subjecthelper";
  8. }
  9.  
  10. }
  11. }  

2.4 在autofac中注册并映射

  1. namespace test
  2. {
  3. // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
  4. // 请访问 http://go.microsoft.com/?LinkId=9394801
  5.  
  6. public class MvcApplication : System.Web.HttpApplication
  7. {
  8. protected void Application_Start()
  9. {
  10. var builder = new ContainerBuilder();
  11. builder.RegisterType<CategoryHelper>().As<ICategoryHelper>().InstancePerHttpRequest();
  12.  
  13. builder.RegisterType<NewsHelper>().Named<INewsHelper>("news");
  14. builder.RegisterType<SubjectHelper>().Named<INewsHelper>("subject");
  15.  
  16. builder.RegisterControllers(Assembly.GetExecutingAssembly());
  17. var container = builder.Build();
  18. DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
  19.  
  20. AreaRegistration.RegisterAllAreas();
  21. WebApiConfig.Register(GlobalConfiguration.Configuration);
  22. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  23. RouteConfig.RegisterRoutes(RouteTable.Routes);
  24. BundleConfig.RegisterBundles(BundleTable.Bundles);
  25. AuthConfig.RegisterAuth();
  26. }
  27. }
  28. } 

3、新建ServiceGetter类及  IServiceGetter接口

3.1

  1. namespace test.Interface
  2. {
  3. public interface IServiceGetter
  4. {
  5. T GetByName<T>(string name);
  6. }
  7. }  

3.2

  1. namespace test.Helper
  2. {
  3. public class ServiceGetter:IServiceGetter
  4. {
  5. public T GetByName<T>(string name)
  6. {
  7. return AutofacDependencyResolver.Current.RequestLifetimeScope.ResolveNamed<T>(name);
  8. }
  9. }
  10. }

3.3 增加注册

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

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

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

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

  1. namespace test.Controllers
  2. {
  3. public class HomeController : Controller
  4. {
  5.  
  6. private IServiceGetter getter;
  7.  
  8. public HomeController(IServiceGetter getter)
  9. {
  10.  
  11. this.getter = getter;
  12.  
  13. }
  14.  
  15. public ActionResult Index()
  16. {
  17.  
  18. ViewBag.Message = getter.GetByName<INewsHelper>("subject").GetNewInfo();
  19. return View();
  20. }
  21.  
  22. }
  23. }

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. Cordova - Windows版本图形界面管理工具,告别命令行输入方式!

    Cordova本身提供的是命令行管理工具,并没有提供图形界面管理工具,虽然命令行管理工具可以完成所有Cordova管理,但是对于我这种懒蛋,可真不希望每次都输入命令,而且我更担心一旦输错一个字符,命令 ...

  2. 914. X of a Kind in a Deck of Cards

    In a deck of cards, each card has an integer written on it. Return true if and only if you can choos ...

  3. Sbulime Text 2 修改选中字符串的颜色

    Sublime Text 2 > Preferences > Browse Packages... 假设当前试用的 Color Scheme 是 Monokai,则在 Color Sche ...

  4. 近期js

    1 var value1 = 0, value2 = 0, value3 = 0; for ( var i = 1; i <= 3; i++) { var i2 = i; (function() ...

  5. apicloud 基础

    时间成本  人力成本  很多人想开发app  又碍于时间和金钱成本 . 本色对app  要求不高的话. 混合app 开发是一种很好的方式. apicloud  就是一种很好的方式. apicloud ...

  6. 【bzoj2789】 Letters 树状数组

    又是一道树状数组求逆序对的题目. 这一题我们可以将第二个串中的每一个字母,与第一个串中的字母做两两匹配,令第二个串第i个字母的值id[i]为该字母与第一个串中的字母匹配到的位置. 然后考虑到所求答案为 ...

  7. 《Head First 设计模式》读书笔记

    目录 <Head First 设计模式>读书笔记 创建模式 结构模式 行为模式 用思维导图记录的读书笔记. <Head First 设计模式>读书笔记 模式的分类遵循<设 ...

  8. PowerDesigner最基础的使用方法入门学习(转)

    PowerDesigner最基础的使用方法入门学习   1:入门级使用PowerDesigner软件创建数据库(直接上图怎么创建,其他的概念知识可自行学习) 我的PowerDesigner版本是16. ...

  9. js的事件学习笔记

    目录 0.参考 1.事件流 冒泡传播 事件捕获 2.事件绑定--onclick接口 onclick类的接口,只能注册一个同类事件 onclick类的接口,使用button.onclick = null ...

  10. python处理自然语言:1、调用LTP的API,2、使用pyltp

    最近在学习处理自然语言处理,就发现LTP的(哈工大语言云),这个比我最先使用的jieba分词更好,词库更大,功能也更强大. 这里介绍两种方法:1.调用LTP的API,2.使用pyltp,这里的方法基于 ...