AutoFac实现程序集级别的依赖注入

摘要:
Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,b.dll也会被载入。
1、介绍
所谓程序集级别的依赖注入是指接口和实现的依赖不使用配置文件或硬代码实现builder.RegisterType<UserInfoService>().As<IUserInfoService>();),而是通过名称约定实现依赖注入
2、项目接口及dll
2.1 项目结构(创建MVC3项目)
AutoFac实现程序集级别的依赖注入第1张
AutoFac实现程序集级别的依赖注入第2张
2.2 UI层需引入的dll(使用nuget引入)
2.2.1Autofac
2.2.2Autofac.Integration.Mvc
2.2.3MyMVC3.Business.IServices
2.2.4MyMVC3.Modules.IRepository
2.2.5MyMVC3.Modules.Model
3、依赖注入配置代码(在Global.asax的Application_Start方法中调用)
/// <summary>
      ///使用AutoFac实现依赖注入
      /// </summary>
      private voidautoFac()
      {
          var builder = newContainerBuilder();
          SetupResolveRules(builder);  //注入

          builder.RegisterControllers(Assembly.GetExecutingAssembly());  //注入所有Controller
          var container =builder.Build();
          DependencyResolver.SetResolver(newAutofacDependencyResolver(container));
      }
private voidSetupResolveRules(ContainerBuilder builder)
       {
           //UI项目只用引用service和repository的接口,不用引用实现的dll。
           //如需加载实现的程序集,将dll拷贝到bin目录下即可,不用引用dll
           var IServices = Assembly.Load("MyMVC3.Business.IServices");   
           var Services = Assembly.Load("MyMVC3.Business.Services");
           var IRepository = Assembly.Load("MyMVC3.Modules.IRepository");
           var Repository = Assembly.Load("MyMVC3.Modules.Repository");
           //根据名称约定(服务层的接口和实现均以Service结尾),实现服务接口和服务实现的依赖
builder.RegisterAssemblyTypes(IServices, Services)
             .Where(t => t.Name.EndsWith("Service"))
             .AsImplementedInterfaces();
           //根据名称约定(数据访问层的接口和实现均以Repository结尾),实现数据访问接口和数据访问实现的依赖
builder.RegisterAssemblyTypes(IRepository, Repository)
             .Where(t => t.Name.EndsWith("Repository"))
             .AsImplementedInterfaces();
//或者

Assembly serviceAss = Assembly.Load("Elight.Service");
Type[] serviceTypes = serviceAss.GetTypes();
builder.RegisterTypes(serviceTypes).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces();//表示注册的类型,以接口的方式注册

Assembly repositoryAss = Assembly.Load("Elight.Repository");
Type[] repositoryTypes = repositoryAss.GetTypes();
builder.RegisterTypes(repositoryTypes).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces();


       }
Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("a.dll"),则载入a.dll,假如a.dll中引用了b.dll的话,b.dll并不会被载入。
Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,b.dll也会被载入。
4、各层级间配置构造函数注入
4.1UserInfoService
privateIUserInfoRepository productRepository;
        publicUserInfoService(IUserInfoRepository productRepository)
        {
            this.productRepository =productRepository;
            this.AddDisposableObject(productRepository);
        }

4.2UserInfoService

publicIUserInfoService userService;
      publicHomeController(IUserInfoService userService)
      {
          this.userService =userService;
          this.AddDisposableObject(userService);
      }

免责声明:文章转载自《AutoFac实现程序集级别的依赖注入》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于 Selection(getSelection ) 对象的一些常规用法集锦MySQL优化服务器设置(MySQL优化配置文件)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

接口自动化---简单的数据驱动框架ATP(基于excel)

数据驱动测试:根据数据进行测试。将用例写入excel文件,用代码读取文件中的数据,从而实现自动化测试。 自动化框架实现步骤: 1、获取用例2、调用接口3、校验结果4、发送测试报告5、异常处理6、日志一、首先准备好用例 在excel文件中用例写好,格式如下:数据一定要填写正确。 二、编写框架结构 ATP框架结构搭建:lib目录下放一些处理操作,logs目录...

接口自动化测试的"开胃小菜"---简单黑客攻击手段

Web应用系统的小安全漏洞及相应的攻击方式 接口自动化测试的"开胃小菜" 1写作目的 本文讲述一个简单的利用WebAPI来进行一次基本没有破坏力的“黑客”行为。 主要目的如下: 了解什么叫安全漏洞 知道什么是api 了解一些获取api的工具 通过对API的认识了解白盒接口测试基本概念和技术 免责声明: 本文主要是以学习交流为目的,而且实验的对象也是通...

python Zope.interface安装使用

一、接口简述 在我们所熟知的面向对象编程语言中,大多提供了接口(interface)的概念。接口在编程语言中指的是一个抽象类型,是抽象方法的集合;它的特点如下: 1、类通过继承接口的方式,来继承接口的抽象方法; 2、接口并不是类(虽然编写类和方法的方式很相似); 3、类描述对象的属性和方法(实现接口的类,必须实现接口内所描述的所有方法,否则必须声明为抽象类...

群发技术-使用python3给微信好友群发消息

本文介绍如何给个人微信好友群发消息。 微信个人号中的群发助手可以一次给30个发送消息,如果要给所有所有群发,则需要自己手动发送多次,或者借助程序实现了。本文即是程序实现教程 一、原理 在微信的官方网站上 https://weixin.qq.com/,提供了一个网页版的微信,地址为 https://wx.qq.com/ 登录该网页版微信后,可以在网页上给对方...

DOM,javascript,Web API之间的关系——onclick 引起的思考与调研

平时习惯了用js操作dom树来与html页面进行交互,基本都是通过web API接口实现的,最近看闭包和原生js的知识点比较多,昨天无意中看到了onclick中的this指向问题,遂用native js方式模拟了onclick再html标签里的this和js事件里的this,详见上一篇博客:用js的eval函数模拟Web API中的onclick事件 下文...

Android 使用Parcelable序列化对象

转:http://ipjmc.iteye.com/blog/1314145       Android序列化对象主要有两种方法,实现Serializable接口、或者实现Parcelable接口。实现Serializable接口是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,而且还可...