AutoFac在项目中应用的体会
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在项目中应用的体会的更多相关文章
- Autofac在项目中应用的体会,一个接口多个实现的情况
在本人接触的项目中Autofac应用的比较多一些,我理解的他的工作原理就是 注册类并映射到接口,通过注入后返回相应实例化的类! 下面说说我在项目中的实际应用 先来简单介绍下Autofac的使用 1. ...
- AutoFac在项目中的应用
技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCode ...
- Redis的安装以及在项目中使用Redis的一些总结和体会
第一部分:为什么我的项目中要使用Redis 我知道有些地方没说到位,希望大神们提出来,我会吸取教训,大家共同进步! 注册时邮件激活的部分使用Redis 发送邮件时使用Redis的消息队列,减轻网站压力 ...
- 转:C++项目中的extern "C" {}
引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __c ...
- C++项目中的extern "C" {}
from:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html C++项目中的extern "C" {} 20 ...
- 新的MOVE结构,和在项目中实际的感受
关于MVC/MVP的瑕疵 MVC 和 MVP是最简单,最脍炙人口的框架结构. 有一段时间, 凡事有一定规模的代码,我都会架在上面,甚至后台程序也不例外(预留出可以注册的用户交互接口,作为后台控制器). ...
- jQuery在项目中的应用
版权声明:本文为博主原创文章,未经博主允许不得转载.(转载需注明出处 http://www.cnblogs.com/yanfei1819/p/7743661.html) [摘要] 最近在项目中应用 ...
- 我是如何在公司项目中使用ESLint来提升代码质量的
ESLint:你认识我吗 ESLint是一个语法规则和代码风格的检查工具. 和学习所有编程语言一样,想要入门ESLint,首先要去它的官网看看:https://eslint.org/. ESLint的 ...
- 编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理
原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下! 文章宗旨:Talk is cheap show me the code. 大成若缺,其 ...
随机推荐
- 667. Beautiful Arrangement II
Given two integers n and k, you need to construct a list which contains n different positive integer ...
- 688. Knight Probability in Chessboard
On an NxN chessboard, a knight starts at the r-th row and c-th column and attempts to make exactly K ...
- .Net - WebApi
WebApi C#进阶系列 - WebApi: WebApi 服务监控 + log4net:
- day 41 数据库初学习
前情提要: 数据库初识别 一:数据库的介绍 https://github.com/Endless-Clould/homework/blob/master/student_system.sql 数据再这 ...
- POJ 2260
#include <iostream> #define MAXN 100 using namespace std; int _m[MAXN][MAXN]; int main() { //f ...
- POJ 1087
#include<iostream> #include<stdio.h> #include<string> #define MAXN 105 using names ...
- 剑指offer四十二之和为S的两个数字
一.题目 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 二.思路 数列满足递增,设两个头尾两个指针i和j,若ai + ...
- 死锁、Lock锁、等待唤醒机制、线程组、线程池、定时器、单例设计模式_DAY24
1:线程(理解) (1)死锁 概念: 同步中,多个线程使用多把锁之间存在等待的现象. 原因分析: a.线程1将锁1锁住,线程2将锁2锁住,而线程1要继续执行锁2中的代码,线程2要继续执行锁1中的代码, ...
- (转)python学习笔记5--decimal
原文:https://blog.csdn.net/lemonwyc/article/details/37583125 上一节提到了除了基本类型之外的decimal,这节就学习下.查看python3.4 ...
- Vundle,Vim 的 Bundle(转)
长久以来,我管理 Vim 配置的方式都非常原始—— zip 打包,然后发到邮箱上.偶尔会发生忘记备份,或者配置混淆的状况,不过由于懒筋发作,竟然这个方案就这么用了两年. 终有一天,我觉得这个方法太笨了 ...