本来想聊一下面试过程的,1个星期面了6家,4家当场给offer,2家技术通过(1家没下文,1家复试).从中也学习到一些东西,先还是继续Coding吧.

官网:http://autofac.org/

下载:Install-Package Autofac -Version 3.5.2

Autofac是轻量级的开源IOC容器,传说是速度最快的一个,同类的框架还有用过Castle Windsor、StructureMap、Unity、Spring.Net等.

本节目录

Hello World

1.建立项目

CA:一个控制台项目,引用Nuget Autofac包.

2.建立一个依赖外部的类

    public class Test
{
public Test(string str)
{
Console.WriteLine("hello " + str);
}
}

3.根据参数名直接注入

static void Main(string[] args)
{
  //创建容器工厂
var builder = new ContainerBuilder();
//注册Test类型到工厂中
builder.RegisterType<Test>();
  //通过工厂创建容器
using (var container = builder.Build())
{
    //解析Test并返回Test实例
container.Resolve<Test>(new NamedParameter("str", "world"));
}
Console.ReadKey();
}

过程:首先需要创建容器工厂,然后将各种类型注册到工厂中,再创建容器,通过容器实例化对象.

注入高级对象

添加1个构造函数

public Test(ISay say)
{
Console.WriteLine("say:" + say.Get());
}

接口及其实现

    public class Say : ISay
{
public string Get()
{
return "hello world";
}
} public interface ISay
{
string Get();
}

注入实现(Autofac会自动装配)

        static void Main(string[] args)
{
var builder = new ContainerBuilder(); builder.RegisterType<Test>();
builder.RegisterType<Say>().As<ISay>();
using (var container = builder.Build())
{
container.Resolve<Test>();
}
Console.ReadKey();
}

略作修改

     public Test(Say say)//将接口改为指定具体实现类
{
Console.WriteLine("say:" + say.Get());
}

此时运行代码会报错,因为在容器中我们只注册了ISay接口.改为As<Say>或以下方式

builder.RegisterType<Say>().As<ISay>().AsSelf();

对象生命周期

注册到工厂的类型默认都调用InstancePerDependency方法.实现每个依赖都创建1个新实例

单例模式:

            builder.RegisterType<Test>().SingleInstance();

读取配置文件注入

需要引用Nuget Autofac.Configuration包

注册类型代码

builder.RegisterModule(new ConfigurationSettingsReader("autofac"));

App.config

  <configSections>
<section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration" />
</configSections>
<autofac defaultAssembly="CA">
<components>
<component type="CA.Say, CA" service="CA.ISay" />
<component type="CA.Say, CA" service="CA.Say" />
</components>
</autofac>

service相当于As<T>中的T

结合ASP.NET MVC

1.Install-Package Autofac.Mvc5

2.Application_Start事件添加此方法

        protected void Application_Start(object sender, EventArgs e)
{
#region 1.MVC Autofac注入
var builder = new ContainerBuilder();
//类名.EndsWith("Controller")
builder.RegisterControllers(Assembly.GetExecutingAssembly());
//这样既支持接口 又支持自己的类型
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.AsImplementedInterfaces().AsSelf();
//容器
var container = builder.Build();
//注入改为Autofac注入
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
#endregion #region 2.注册MVC路由
var routes = RouteTable.Routes;
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
#endregion
}

3.带参数的控制器构造函数

    public class HomeController : Controller
{
public HomeController(Say say)
{ }
public string Index()
{
return "Hello World";
}
} public class Say
{
public string Get()
{
return "Hello World";
}
}

4.浏览器访问~/

结合ASP.NET Web API

1.Install-Package Autofac.WebApi

2.由于WebAPI需要,引用系统自带Web.Http和Web.Http.WebHost

3.Application_Start添加此方法

        protected void Application_Start(object sender, EventArgs e)
{
var configuration = GlobalConfiguration.Configuration;
#region Autofac WebAPI注入
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces().AsSelf();
var container = builder.Build();
configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
#endregion #region 注册Web API路由
configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
#endregion
}

4.带参数的控制器构造函数

    public class ValuesController : ApiController
{
public ValuesController(Say say)
{ }
public string Get()
{
return "Hello World";
}
} public class Say
{
public string Get()
{
return "Hello World";
}
}

5.浏览器访问~/api/values

结合WCF

1.Install-Package Autofac.Wcf

2.Application_Start添加此方法

        protected void Application_Start(object sender, EventArgs e)
{
#region WCF Autofac注入
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces().AsSelf();
var container = builder.Build();
//WCF IOC容器
AutofacHostFactory.Container = container;
#endregion
}

3.新建svc服务

    public class TestService : ITestService
{
public TestService(Say say)
{ }
public string DoWork()
{
return "Hello World";
}
} public class Say
{
public string Get()
{
return "Hello World";
}
} [ServiceContract]
public interface ITestService
{
[OperationContract]
string DoWork();
}

4.svc指令中加一句:

Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf"

5.wcftestclient

惭愧,好久没发博客了

[Solution] 使用Autofac在MVC、Web API、WCF中实现IOC的更多相关文章

  1. ASP.NET MVC & Web API项目中集成MEF

    1.实现方式 //WebApi需要实现的接口 System.Web.Http.Dependencies.IDependencyResolver //MVC需要实现的接口 System.Web.Mvc. ...

  2. .net mvc web api Autofac依赖注入框架-戈多编程

    今天自己搭了一套基于三层的依赖注入mvc web api 的依赖注入框架,在此总结下相关配置 1.设置应用程序的.net Framework版本为 4.5 2.通过Nuget 安装autofac包 I ...

  3. ASP.NET MVC Web API Post FromBody(Web API 如何正确 Post)

    问题场景: ASP.NET MVC Web API 定义 Post 方法,HttpClient 使用 JsonConvert.SerializeObject 传参进行调用,比如 Web Api 中定义 ...

  4. ASP.NET MVC Web API For APP

    近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScr ...

  5. mvc Web api 如何在控制器中调用

    关于如何调用 mvc Web api 的方法,网上一搜就是一大把,基本都是在前台jq中调用的,但是如何在后台调用呢? 本楼主做了一下测试,仅供参考. 先写一个简单的api,如下:[域1] namesp ...

  6. 实战 ASP.NET MVC Web API

    实战 ASP.NET MVC Web API Web API 框架基于 ASP.NET MVC 框架开发,是一个面向 Http 协议的通信框架.相对于 WCF 而言,Web API 只面向于 Http ...

  7. 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入

    系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...

  8. [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序

    本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...

  9. 【转载】ASP.NET MVC Web API 的路由选择

    此文章描述了ASP.NET Web API如何将Http请求路由到controller. 路由表 在ASP.NET Web API中,controller是用来处理HTTP请求的一个类.这个类中用于处 ...

  10. 【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系 ...

随机推荐

  1. mybatis热加载的实现

    最近在使用mybatis,由于是刚刚开始用,用的并不顺手,目前是感觉有2个地方非常的不好用: 1.mybatis调试不方便 由于dao层只有接口,实现只是一个map的xml文件,想加断点都没有地方加, ...

  2. 【转】开放api接口签名验证

    不要急,源代码分享在最底部,先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候, ...

  3. android studio logcat 换行(日志换行)

    起因 今天突然要调试网络数据,调试一大截那个xml数据. 解决思路 一开始去setting哪里看一下logcat 是否有line break,类似的字眼,可惜没有. 我猜如果没有在设置的话,估计就在“ ...

  4. hibernate 映射 多对一

    一对多和上文讲的多对一两种映射关系,其实就是站在相反的角度考虑同样的事情. 一对多和多对一映射原理是一样的,都在多的一端加入一个外键指向一的一端.也就是说,在关系数据库的表中,他们的表及表字段都是一样 ...

  5. ExtJs 可查询的下拉框

    最近项目中有个需求,就是有四个模块需要加载一个主表的内容,比如说这个表叫项目表(比如项目表里有两个字段一个是项目ID--projCd,还有一个是项目名称--projNm).主表的内容的要放在一个下拉框 ...

  6. iOS 日期处理 (Swift3.0 NSDate)

    处理日期的常见情景 NSDate -> String & String -> NSDate 日期比较 日期计算(基于参考日期 +/- 一定时间) 计算日期间的差异 拆解NSDate ...

  7. 【汇总】iOS开发及Xcode使用中遇到的一些报错问题汇总

    这里整合下在开发过程中遇到过的一些报错问题和解决办法:(今天开始逐渐增加)   Xcode编译错误集锦:http://www.cnblogs.com/ios-wmm/p/3402261.html   ...

  8. python问题:IndentationError:expected an indented block错误解决

    Python语言是一款对缩进非常敏感的语言,给很多初学者带来了困惑,即便是很有经验的Python程序员,也可能陷入陷阱当中.最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分 ...

  9. Nginx upstream 长连接

    原文: http://bollaxu.iteye.com/blog/900424 Nginx upstream目前只有短连接,通过HTTP/1.0向后端发起连接,并把请求的"Connecti ...

  10. 使用git提交内容到网盘

    1.创建版本库(注意勾选纯版本库的选项) 2.客户端获取版本库代码 3.提交及获取 master是git默认的主要分支(主干),适合单人独自开发.多人开发时可以给每个人创建一个分支 参考资料: htt ...