autofac使用笔记

在之前的项目中用来解耦的使用的轻型IOC框架是unity,它的使用也是很方便的提供在之前的文章的也提到过它的使用方式,但是使用久了之后发现了它的不足之处就是需要配置xml文件来对应的接口和实现的关系。总觉这种不够灵活。因为随着项目的进行需要配置的接口和实现会越来越多。配置起来很是麻烦还容易出错。我在想有没有别的IOC框架能够一劳永逸的实现解耦而不是通过配置呢。

答案是肯定的。 那就是autofac ,这是我在Github 上找到的轻型的IOC框架。它的使用方式也特别的简单。原理呢简单来说。是通过遍历程序集来实现的(PS:当然它也是支持通过配置文件来实现的这里我就不详细说了)。详细的信息呢大家可以轻易autofac 的官网下载源码来看。网址是 http://autofac.org/  它的最大特色呢就是约定实现。什么是约定实现。意思就是说你的接口和现实之间需要一个默认的约定。就跟创建控制器一样必须以controller来结尾一样。

下面我就直接贴代码了这个是我做的一个dome 是在在MVC5 webapi 中实现的注入

当然在是用之前你需要在安装几个包。直接nuget就行了一共需要三个包

按顺序说明下

step1 PM> Install-Package Autofac -Version 3.5.0 直接在包管理里面输入这个命令  nuget地址是https://www.nuget.org/packages/Autofac/3.5.0

step2 PM> Install-Package Autofac.Mvc5 添加这个包  nuget地址是https://www.nuget.org/packages/Autofac.Mvc5/

step3 PM> Install-Package Autofac.WebApi 最后是添加autofac webapi的包 https://www.nuget.org/packages/Autofac.WebApi/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using Autofac;
using Autofac.Integration.Mvc;
using Autofac.Integration.WebApi;

namespace WebApiIoc.App_Start
{
    public static class autofaconfig
    {
        public static void Initialize(HttpConfiguration config)
        {
            Initialize(config, RegisterServices(new ContainerBuilder()));//初始化容器
        }

        public static void Initialize(HttpConfiguration config, IContainer container)
        {
            config.DependencyResolver = new AutofacWebApiDependencyResolver(container);//注册api容器
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//注册MVC容器
        }

        private static IContainer RegisterServices(ContainerBuilder builder)
        {
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());//注册api容器的实现

            builder.RegisterControllers(Assembly.GetExecutingAssembly());//注册mvc容器的实现

            builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())//查找程序集中以services结尾的类型
                .Where(t => t.Name.EndsWith("Services"))
                .AsImplementedInterfaces();
            builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())//查找程序集中以Repository结尾的类型
           .Where(t => t.Name.EndsWith("Repository"))
           .AsImplementedInterfaces();

            return builder.Build();//返回容器
        }
    }
}

 这个是autofac的配置文件。

下面是webapiconfig文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using WebApiIoc.App_Start;

namespace WebApiIoc
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            //注册webapi和mvc容器
            autofaconfig.Initialize(config);
        }
    }
}

最后是global文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Autofac;
using Autofac.Integration.Mvc;
using Autofac.Integration.WebApi;
using WebApiIoc.App_Start;

namespace WebApiIoc
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

        }
    }
}

在apicontroller和MVCcontroller里面都是通过构造函数注入的方式实现的下面贴出来代码

这个是MVC

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Iservices;
using Microsoft.Ajax.Utilities;

namespace WebApiIoc.Controllers
{
    public class HomeController : Controller
    {
        private IOneServices _oneServices;

        public HomeController(IOneServices oneServices)
        {
            _oneServices = oneServices;

        }

        public ActionResult Index()
        {
            var sum = _oneServices.sum(10, 20);

            var aa = DependencyResolver.Current.GetService<IOneServices>();

            ; ViewBag.Title = sum;

            return View();
        }
    }
}

这个是webapi

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Dependencies;
using Autofac;
using Autofac.Integration.WebApi;
using Iservices;

namespace WebApiIoc.Controllers
{
    public class ValuesController : ApiController
    {

        private IOneServices _oneServices;

        public ValuesController(IOneServices oneServices)

        {
            _oneServices = oneServices;

        }

        // GET api/values
        public IEnumerable<string> Get()
        {
            var sum = _oneServices.sum(1, 2);return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values
        public void Post([FromBody]string value)
        {
        }

        // PUT api/values/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/values/5
        public void Delete(int id)
        {
        }
    }
}

最后说明下如果你没有通过构造函数注入你又想获取实例的话怎么做呢。下面分别说明

MVC

          var OneServices = DependencyResolver.Current.GetService<IOneServices>();

Webapi

            IDependencyScope dependencyScope = this.Request.GetDependencyScope();
            ILifetimeScope requestLifetimeScope = dependencyScope.GetRequestLifetimeScope();
            var customerService = requestLifetimeScope.Resolve<IOneServices>();

其他的比如属性注入和方法注入就不在这写了。这里只是写的常用的简单的注册方式,后面我会把这部分注册的方式给补上.

基本到这里整个注册流程就完事了。以上写的不足之处请指出我会修正。希望和大家共同成长.

时间: 2024-10-19 09:27:41

autofac使用笔记的相关文章

《你必须知道的.NET》读书笔记三:体验OO之美

一.依赖也是哲学 (1)本质诠释:"不要调用我们,我们会调用你" (2)依赖和耦合: ①无依赖,无耦合: ②单向依赖,耦合度不高: ③双向依赖,耦合度较高: (3)设计的目标:高内聚,低耦合. ①低耦合:实现最简单的依赖关系,尽可能地减少类与类.模块与模块.层次与层次.系统与系统之间的联系: ②高内聚:一方面代表了职责的统一管理,一方面又代表了关系的有效隔离: (4)控制反转(IoC):代码的控制器交由系统控制而不是在代码内部,消除组件或模块间的直接依赖: (5)依赖注入(DI): ①

【读书笔记】--代码整洁之道

“相对于任何宏伟景愿,对细节的关注甚至是更为关键的专业性基础.首先,开发者通过小型实践获得可用于大型实践的技能和信用度.其次,宏伟建筑中最细小的部分,比如关不紧的门,有点儿没有铺平的地板,甚至是凌乱的桌面,都会将整个大局的魅力毁灭殆尽.这就是整洁代码之所系”----没有比书中的这段话更能说明这本书的意义了. <代码整洁之道>是第1期书山有路活动选出的读本.相对于记住那些如何写出整洁代码的那些法则,养成保持代码整洁.提高代码质量的习惯和思维更为重要.全书大致分为三个部分,第一部分1-10章都是介

【AutoFac】依赖注入和控制反转的使用

在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的手中,在这个时候我们不是一个创建者,我们是以一个请求者的身份去请求容器给我们这个对象实例.我们所有的对象依赖于容器提供给你的资源,控制权落到了容器身上.在这里的身份转化或许就是控制反转的核心吧. 依赖注入:我们向容器发出请求以后,获得这个对象实例的过程就叫依赖注入.也就是我们在使用对向前我们都需要先

.NET Core下自带容器IServiceCollection以及AutoFac以及AutoFac中AOP简介

https://www.cnblogs.com/artech/p/net-core-di-01.html 大内老A的在.NET Core下对这些的介绍,有一系列文章 https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html https://www.cnblogs.com/artech/p/dependency-injection-in-asp-net-core.html https://www.zybuluo.com/dasajia2la

【安全牛学习笔记】

弱点扫描 ╋━━━━━━━━━━━━━━━━━━━━╋ ┃发现弱点                                ┃ ┃发现漏洞                                ┃ ┃  基于端口五福扫描结果版本信息(速度慢)┃ ┃  搜索已公开的漏洞数据库(数量大)      ┃ ┃  使用弱点扫描器实现漏洞管理            ┃ ╋━━━━━━━━━━━━━━━━━━━━╋ [email protected]:~# searchsploit Usage:

51CTO持续更新《通哥的运维笔记》

<通哥的运维笔记>将持续在51CTO网站更新,希望大家多多关注.互相学习,后期,我将会退出<通哥的运维笔记>系列视频教程,希望带给大家最大的收获,帮助大家更好的学习.进步.<通哥的运维笔记>主要从linux系统管理.虚拟化.cloudstack云平台以及网络管理之CCNA.CCNP.CCIE,等等方面深入讲解.

WPF笔记整理 - Bitmap和BitmapImage

项目中有图片处理的逻辑,因此要用到Bitmap.而WPF加载的一般都是BitmapImage.这里就需要将BitmapImage转成Bitmap 1. 图片的路径要用这样的,假设图片在project下的Images目录,文件名XXImage.png. pack://application:,,,/xxx;component/Images/XXImage.png 2. 代码: Bitmap bmp = null; var image = new BitmapImage(new Uri(this.X

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main