简单的依赖注入之Autofac使用

1.在“工具”->“NuGet包管理器”->"程序包管理器控制台"执行一下代码,安装autofac。 

  Install-Package Autofac

 当使用 autoFac 开发ASP .net 遇到 ContainerBuilder() 不包含RegisterControllers 方法解决方案(MVC环境下,注入Controller需要安装包)

Install-Package Autofac.Mvc5 -Version 4.0.2

当然也可以在项目点击右键点击“管理NuGet程序包 ”,在NuGet管理包页面,搜索AutoFac,进行下载安装。

2.using AutoFac;

  using  AutoFac.Intergation.MVC;

3.准备工作做好了,下一步开始注入

3.1  首先定义IService接口

   

public interface IService
    {
        string Test();

    }

3.2 实现IService的类

public class AService : IService
    {
        public string Test()
        {
            return "My name is A Service!";
        }
    }

3.3 定义准备注入的Controller

private readonly IService _service;

        public HomeController(IService iService)
        {
            _service = iService;
        }

        public ActionResult Index()
        {
            ViewBag.ServiceMessage = _service.Test();
            return View();
        }

3.4 global 类中Application_Start方法中加入注入代码

//创建一个容器
            var builder = new ContainerBuilder();

            builder.RegisterAssemblyTypes();
            //注册所有的controller
            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            //RegisterType方式:
            builder.RegisterType<IService>().AsSelf().InstancePerDependency();
            //Register方式
            builder.Register(c => new AService()).AsSelf().InstancePerDependency();

            // 自动注入的方式,不需要知道具体类的名称

            /* BuildManager.GetReferencedAssemblies()
             * 程序集的集合,包含 Web.config 文件的 assemblies 元素中指定的程序集、
             * 从 App_Code 目录中的自定义代码生成的程序集以及其他顶级文件夹中的程序集。
             */

            //获取包含继承了IService接口类的程序集
            var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(assembly => assembly.GetTypes().FirstOrDefault(type => type.GetInterfaces().Contains(typeof(IService))) != null);

            //注册程序集 registerAssemblyTypes
            var enumerable = assemblies as Assembly[] ?? assemblies.ToArray();
            if (enumerable.Any())
            {
                builder.RegisterAssemblyTypes(enumerable).Where(type => type.GetInterfaces().Contains(typeof(IService))).AsImplementedInterfaces().InstancePerDependency();
            }

            //把容器装入到微软默认的依赖注入容器中
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

3.5 访问home/index 查看一下效果吧。


4.总结

1.依赖注入的目的是为了解耦。
2.不依赖于具体类,而依赖抽象类或者接口,这叫依赖倒置。
3.控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器

猜你喜欢

转载自blog.csdn.net/gaozhigang/article/details/80622184