在本人接触的项目中Autofac应用的比较多一些,我理解的他的工作原理就是  注册类并映射到接口,通过注入后返回相应实例化的类

下面说说我在项目中的实际应用

先来简单介绍下Autofac的使用

1、通过Nuget或代码安装autofac

安装autofac :install-package autofac

安装对mvc4的支持:install -package autofac.mvc4(本人项目为mvc4)

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

2.1、新建接口 INewsHelper

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

2.2、新建类NewsHelper并继承INewsHelper

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

2.3 新建类SubjectHelper并继承INewsHelper  

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

2.4 在autofac中注册并映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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

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

3.2

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

3.3 增加注册

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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(1);
            return View();
        }
        
    }
}

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

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

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

看下实际的效果:

情况1:

效果1:

情况2:

效果2:

Autofac在项目中应用的体会,一个接口多个实现的情况相关推荐

  1. python神奇时钟项目_怎么在Python项目中利用Pygame绘制一个时钟

    怎么在Python项目中利用Pygame绘制一个时钟 发布时间:2020-11-30 14:24:30 来源:亿速云 阅读:54 作者:Leah 怎么在Python项目中利用Pygame绘制一个时钟? ...

  2. 在vue项目中:统一封装 Axios 接口与异常处理

    在vue项目中:统一封装 Axios 接口与异常处理 参考文章: (1)在vue项目中:统一封装 Axios 接口与异常处理 (2)https://www.cnblogs.com/itgezhu/p/ ...

  3. Spring Boot项目中使用RestTemplate调用https接口出现 unable to find valid certification path to requested target

    问题描述:Spring Boot项目中使用RestTemplate调用https接口出现以下错误: PKIX path building failed: sun.security.provider.c ...

  4. 利用classloader同一个项目中加载另一个同名的类_线程上下文类加载器ContextClassLoader内存泄漏隐患...

    前提 今天(2020-01-18)在编写Netty相关代码的时候,从Netty源码中的ThreadDeathWatcher和GlobalEventExecutor追溯到两个和线程上下文类加载器Cont ...

  5. SpringBoot项目中怎么保证提供的接口不会被调崩

    一.背景 像我们做项目写接口的时候,一定要考虑接口的并发性,要是写的接口提供第三方系统来调用,更需要保证自己提供的接口不会被调崩.有的并发性高的系统,在同一时刻或者同一小时间段,会有大量流量涌入,这时 ...

  6. 高效开发,项目中是否有聚合服务接口

    前言 服务拆分之后,前后端同学之间关于 API 粒度的争吵越来越常见: 「前端同学请求两个接口,聚合一下数据不就行了?」后端同学想只提供业务领域基础 API 服务能力,数据组装处理则希望由前端同学完成 ...

  7. 项目中应该如何提升java接口的响应速度

    在实际开发过程中,我们需要考虑到接口的相应速度,一般需要考虑以下几点: 1.采用池化技术优化提升响应速度 2.接口中应用缓存技术,提升数据的加载速度(例如夜晚redis跑批数据,调取接口时直接从red ...

  8. MVC4项目中验证用户登录一个特性就搞定

    在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性.// 摘要:// 表示一个特性,该特性用于限制调用方对操作方法的访问.[AttributeUsage(AttributeT ...

  9. AutoFac在项目中的应用

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

最新文章

  1. gis 数据框裁剪_ArcGis入门学习教程带练习数据
  2. C++ 强制类型转换(转载)
  3. 线程安全面试题 java_Java面试题-线程安全
  4. 【C语言】switch…case无break情况(2)
  5. Android 简单基站定位程序
  6. java.util.concurrent.BlockingQueue指南
  7. 在html页面中使用模板继承,HTML静态模板的继承
  8. Milvus加入LF AI孵化,立志成为最流行的AI数据平台
  9. 【bzoj1668/Usaco2006 Oct】Cow Pie Treasures 馅饼里的财富——dp
  10. 怎么在html中写java代码,在html里面写java代码
  11. 360安全卫士加速球误关闭某个应用软件
  12. 苹果手机长截屏_涨知识了!原来苹果手机也可以长截屏,还不知道的,快来学一学...
  13. 最低生活保障数据采集(民政部门)Excel到数据库满足审计部门需要 源代码
  14. SpringCloud-Netflix
  15. iOS 屏幕适配浅谈
  16. c语言读取jpg字节,JPG图片C语言解码显示例子-期末倾情奉献
  17. testflight无法联网怎么办_Testflight不可用怎么办?
  18. Juphoon RCS年度成绩单,请查收!
  19. Codeforces Round #628 (Div. 2) C. Ehab and Path-etic MEXs(贪心+思维)
  20. Python列表使用

热门文章

  1. collection集合 网_房地产信托业务(集合)2020年1-9月分析报告
  2. java 常量池是什么_Java常量池理解与总结
  3. mysql忘记了密码、允许远程连接、mysql卸载 -- linux
  4. 【切图】门户网首页模板一 (类似CSDN)
  5. 系统理解Win32 API和MFC
  6. mysql 索引表的应用_MySQL查询优化之索引的应用详解
  7. 树链剖分(入门学习)
  8. MySql字符串与时间日期之间的的转换
  9. Java 代理访问http
  10. sql server alter权限_SQL