Autofac在项目中应用的体会,一个接口多个实现的情况
在本人接触的项目中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 经典模式的说明, 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在项目中应用的体会,一个接口多个实现的情况的更多相关文章
- AutoFac在项目中应用的体会
AutoFac的工作原理就是:注册类并映射到接口,通过注入后返回相应实例化的类! 先来简单介绍下Autofac的使用 1.通过Nuget或代码安装autofac 安装autofac :ins ...
- 使用AOP和Semaphore对项目中具体的某一个接口进行限流
整体思路: 一 具体接口,可以自定义一个注解,配置限流量,然后对需要限流的方法加上注解即可! 二 容器初始化的时候扫描所有所有controller,并找出需要限流的接口方法,获取对应的限流量 三 使用 ...
- 转:C4项目中验证用户登录一个特性就搞定
转:C4项目中验证用户登录一个特性就搞定 在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用 ...
- 一个项目中:只能存在一个 WebMvcConfigurationSupport (静态文件失效之坑)
一个项目中:只能存在一个 WebMvcConfigurationSupport 在一个项目中WebMvcConfigurationSupport只能存在一个,多个的时候,只有一个会生效. 静态文件访问 ...
- java web项目(spring项目)中集成webservice ,实现对外开放接口
什么是WebService?webService小示例 点此了解 下面进入正题: Javaweb项目(spring项目)中集成webservice ,实现对外开放接口步骤: 准备: 采用与spring ...
- C#.NET常见问题(FAQ)-程序如何把窗体文件从从一个项目中复制到另一个项目
一个窗体有三个文件,全部拷贝到新的项目中 在新的项目中点击显示所有文件,然后右击导入的文件,点击包括在项目中,会自动修改颜色(此时还没有被识别为窗体) 重启这个项目,三个文件已经被识别出来了 ...
- C#程序如何把窗体文件从从一个项目中复制到另一个项目
一个窗体有三个文件,全部拷贝到新的项目中 在新的项目中点击显示所有文件,然后右击导入的文件,点击包括在项目中,会自动修改颜色(此时还没有被识别为窗体) 重启这个项目,三个文件已经被识别出来了 ...
- 在webpack搭建的vue项目中如何管理好后台接口地址
在最近做的vue项目中,使用了webpack打包工具,以前在做项目中测试环境和生产环境的接口地址都是一样的,由于现在接口地址不一样,需要在项目打包的时候手动切换不同的地址,有时候忘记切换就要重新打包, ...
- 在.net core web api项目中安装swagger展示api接口(相当于生成api文档)
1, 建立或打开项目后,在“程序包管理器控制台”中执行以下命令添加包引用: Install-Package Swashbuckle.AspNetCore 2,在项目中打开Startup.cs文件,找 ...
随机推荐
- Qt Quick的国际化和本地化
国际化您的应用程序 以下部分描述了国际化QML源代码的各个方面.如果您对应用程序中的所有用户界面组件都遵循这些指南,则可以针对不同语言和本地文化约定(例如日期和数字的格式化方式)本地化应用程序的各个方 ...
- DataGridView使用技巧七:列顺序的调整、操作行头列头的标题
一.列顺序的调整 设定DataGridView的AllowUserToOrderColumns为True的时候,用户可以自由调整列的顺序. 当用户改变列的顺序的时候,其本身的Index不好改变,但是D ...
- 400错误,Required String parameter 'paramter' is not present
1.就拿简单的登录来说吧,这是开始的代码 @RequestMapping(value="/login")public ModelAndView login(@RequestPara ...
- r函数知识总结
1. rbind(), cbind(): 构造.合并vector 或matrix为一个矩阵:cbind(1, 1:10) ----默认列合并, rbind(1, 1:10) ----行合并(or构造 ...
- CSS编写指导规范和建议
在参与规模庞大.历时漫长且参与人数众多的项目时,所有开发者遵守如下规则极为重要: 保持 CSS 易于维护 保持代码清晰易懂 保持 CSS 的可拓展性 为了实现这一目标,我们要采用诸多方法. 本文档第一 ...
- 【转】MFC 对话框Border属性设置(None、Thin、Resizing、Dialog Frame)
对话框的Border属性对应的值设置 Dialog Frame WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_CLIPSIBLINGS | DS_MODALFRAME ...
- matplotlib中的legend()——用于显示图例
legend()的一个用法: 当我们有多个 axes时,我们如何把它们的图例放在一起呢?? 我们可以这么做: import matplotlib.pyplot as plt import numpy ...
- 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库
MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...
- jquery -- onchange
触发onchange 首先页面有一个input标签,并且已绑定onchange事件,如: 1 <input type="text" onchange="consol ...
- 【Java集合的详细研究5】Java中Array与ArrayList的主要区别
1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array([]):最高效:但是其容量固定且无法动态改变: ArrayList: 容量可动态增长:但牺 ...