[Solution] 使用Autofac在MVC、Web API、WCF中实现IOC

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03



本来想聊一下面试过程的,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
  • 注入高级对象
  • 读取配置文件注入
  • 结合ASP.NET MVC
  • 结合ASP.NET Web API
  • 结合WCF

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

惭愧,好久没发博客了

参考页面:http://qingqingquege.cnblogs.com/p/5933752.html

时间: 2024-12-20 18:18:51

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

Asp.net mvc web api 在项目中的实际应用

Asp.net mvc web api 在项目中的实际应用 前言:以下只是记录本人在项目中的应用,而web api在数据传输方面有多种实现方式,具体可根据实际情况而定! 1:数据传输前的加密,以下用到 微软自带的 Rijndael 类(关于Rijndael 的更多信息请参见MSDN),32位密钥加16对称算法初始化向量,代码如下: //简单定义一个实体类: public class User { public int Id { get; set; } public string Name { g

MVC web api 返回JSON的几种方式,JSON时间去T的几种方式。

MVC web api 返回JSON的几种方式 1.在WebApiConfig的Register中加入以下代码 1 config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 2.在WebApiConfig的Register中加入以下代码 1 config.Formatters.Remove(config.Formatters.XmlFormatter);

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

此文章描述了ASP.NET Web API如何将Http请求路由到controller. 路由表 在ASP.NET Web API中,controller是用来处理HTTP请求的一个类.这个类中用于处理HTTP请求的的公共方法被称之为action method或者简称action.当Web API框架接收到一个请求时,会将这个请求路由到一个action来处理. ASP.NET Web API框架通过使用路由表来确定哪个action方法被调用.Visual Studio 中的ASP.NET Web

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

本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系人 说明:为了方便数据不使用真正的数据库,而是通过内存数据模拟 1.       Web API中包含的方法 Action HTTP method Relative URI GetAllContact GET /api/contact GetContact GET /api/contact /id

[angularjs] MVC + Web API + AngularJs 搭建简单的 CURD 框架

MVC + Web API + AngularJs 搭建简单的 CURD 框架 GitHub 地址:https://github.com/liqingwen2015/Wen.MvcSinglePage 布局页的引用 <script src="~/Scripts/jquery-1.10.2.min.js"></script> <script src="~/Scripts/bootstrap.min.js"></script&g

ahjesus 让我的MVC web API支持JsonP跨域

无数被跨域请求爆出翔来的人 遇到请求成功却不能进入success 总是提示parsererror 参考一下两篇文章吧 参考文章http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api and http://diaosbook.com/Post/2013/12/27/tips-for-aspnet-webapi-cors ahjesus 让我的MVC web API支持JsonP跨域

改变mvc web api 支持android ,ios ,ajax等方式跨域调用

公司一个移动后端的项目用到了 webapi 项目搭建到外网环境共app开发者调用测试接口时遇到了一个问题 接口不允许跨域调用 .查阅资料明白 同源策略原则根据请求报头值 Origin 与回应报头值 Access-Control-Allow-Origin 来判断是否允许调用 解决方法 1.ajax使用jsonp jsonp 是通过请求参数中加入回调函数参数值.webapi 收到回调函数参数值返回数据不再是单纯的json,而是根据回调函数参数值 的js方法调用,这样就避免的同源策略 需要webapi

ABP 教程文档 1-1 手把手引进门之 AngularJs, ASP.NET MVC, Web API 和 EntityFramework(官方教程翻译版 版本3.2.5)含学习资料

本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 转载请注明出处:http://www.cnblogs.com/yabu007/  谢谢 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1-1 手把手引进门 1-2 进阶 1-3 杂项 (相关理论知识) 第一篇含两个步骤. 1-1-1 ASP.NET Core & Entity Framework Core 后端(内核)含两篇 ( 第一篇链接    

[译] 在Web API 2 中实现带JSON的Patch请求

原文链接:The Patch Verb in Web API 2 with JSON 我想在.NET4.6 Web API 2 项目中使用Patch更新一个大对象中的某个字断,这才意识到我以前都没有用过Patch.这是一次难得的学习机会. 我不知道在Web API 2中最好的实现方式是什么,所以我按照惯例,用google搜索"Patch Web API".我得到的第一条结果是Michael McKenna's "How to Add JSON Patch Support to

Web API项目中使用Area对业务进行分类管理

在之前开发的很多Web API项目中,为了方便以及快速开发,往往把整个Web API的控制器放在基目录的Controllers目录中,但随着业务越来越复杂,这样Controllers目录中的文件就增加很快,难以管理,而且如果有不同业务模块有重复的控制器名的话,还需要尽量避免.引入Area的作用就是把控制器按照不同的业务模块进行区分,方便管理,而且控制器名称可以重名. 1.Web API项目引入Area进行分类 Area在项目中可以称之为区域,每个Area代表应用程序的不同功能模块,Area 使每