WebAPI2使用Autofac实现IOC属性注入完美解决方案
一、前言
只要你是.NETer你一定IOC,IOC里面你也会一定知道Autofac,上次说了在MVC5实现属性注入,今天实现在WebApi2实现属性注入,顺便说一下autofac的程序集的注入方式,都会在后面的代码里面有提现
在WebAPI2使用Autofac注入的时候大多数人会出现如下问题:
未能加载文件或程序集“System.Web.Http, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
截图如下:
这个是Autofac强依赖造成的,比较坑的。解决办法如下。
Nuget添加Microsoft.AspNet.WebApi
或通过NuGet 程序包管理器控制台添加:
Install-Package Microsoft.AspNet.WebApi
Update-Package Microsoft.AspNet.WebApi -reinstall(存在)
原因:我们新建的是一个空的MVC项目,缺少引用
先上个结构图,结构图只是为了说明webAPI如何简单使用Autofac实现属性注入。
属性注入存在安全隐患,官方建议使用构造函数注入。
下面说下具体实现:
二、代码实现
1、新建一个WebAPI.Entity类库,新建一个Person.cs类
public class Person{public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public string Address { get; set; }}
2、新建WebAPI.IRepository类库,新建一个IPersonRepository类
public interface IPersonRepository{List<Person> GetAll();Person Get(int id);Person Add(Person item);bool Update(Person item);bool Delete(int id);}
3、新建WebAPI.Repository类库,新建一个PersonRepository类实现IPersonRepository接口
public class PersonRepository : IPersonRepository{List<Person> person = new List<Person>();public PersonRepository(){Add(new Person { Id = 1, Name = "joye.net1", Age = 18, Address = "中国上海" });Add(new Person { Id = 2, Name = "joye.net2", Age = 18, Address = "中国上海" });Add(new Person { Id = 3, Name = "joye.net3", Age = 18, Address = "中国上海" });}public List<Person> GetAll(){return person;}public Person Get(int id){return person.Find(p => p.Id == id);}public Person Add(Person item){if (item == null){throw new ArgumentNullException("item");}person.Add(item);return item;}public bool Update(Person item){if (item == null){throw new ArgumentNullException("item");}int index = person.FindIndex(p => p.Id == item.Id);if (index == -1){return false;}person.RemoveAt(index);person.Add(item);return true;}public bool Delete(int id){person.RemoveAll(p => p.Id == id);return true;}}
4、新建WebAPI.IServices类库,新建IPersonServices接口
public interface IPersonServices{List<Person> GetAll();}
5、IPersonServices接口在WebAPI.Services类库里面PersonServices实现
public class PersonServices : IPersonServices{//程序集属性注入public IPersonRepository iPerson;public List<Person> GetAll(){return iPerson.GetAll();}}
6、新建一个WebAPI项目WebAPI,新建AutoFacBootStrapper类,nuget安装autofac
public class AutoFacBootStrapper{public static void CoreAutoFacInit(){var builder = new ContainerBuilder();HttpConfiguration config = GlobalConfiguration.Configuration;SetupResolveRules(builder);////注册所有的Controllers//builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();//注册所有的ApiControllers builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();var container = builder.Build();//注册api容器需要使用HttpConfiguration对象config.DependencyResolver = new AutofacWebApiDependencyResolver(container);DependencyResolver.SetResolver(new AutofacDependencyResolver(container));}private static void SetupResolveRules(ContainerBuilder builder){//WebAPI只用引用services和repository的接口,不用引用实现的dll。//如需加载实现的程序集,将dll拷贝到bin目录下即可,不用引用dllvar iServices = Assembly.Load("WebAPI.IServices");var services = Assembly.Load("WebAPI.Services");var iRepository = Assembly.Load("WebAPI.IRepository");var repository = Assembly.Load("WebAPI.Repository");//根据名称约定(服务层的接口和实现均以Services结尾),实现服务接口和服务实现的依赖 builder.RegisterAssemblyTypes(iServices, services).Where(t => t.Name.EndsWith("Services")).AsImplementedInterfaces();//根据名称约定(数据访问层的接口和实现均以Repository结尾),实现数据访问接口和数据访问实现的依赖 builder.RegisterAssemblyTypes(iRepository, repository).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces();}}
7、程序启动注入
protected void Application_Start(){GlobalConfiguration.Configure(WebApiConfig.Register);AreaRegistration.RegisterAllAreas();RouteConfig.RegisterRoutes(RouteTable.Routes);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);BundleConfig.RegisterBundles(BundleTable.Bundles);//程序启动注入 AutoFacBootStrapper.CoreAutoFacInit();}
8.接口调用数据
public IPersonServices IServices { get; set; }// GET api/<controller>public IEnumerable<string> Get(){var list = IServices.GetAll();return new string[] { "value1", "value2" };}
9.运行访问api/values/,打个断点看下搞定
三、总结
autofac确实用起来很方便,上面只是简单的实现,如果想深入学习可以下载我上一个文章提供的两个开源的项目可以学习下,也可以到autofac官网去了解下。
最近在看相关文章,很多都太专业化了没怎么看懂,这是自己现在对IoC的一些理解,记录下来,要不然时间一久,也就忘了。
自己对IoC模式理解还很浅,希望得到各位的指点。
代码下载:
https://yunpan.cn/c6QCURhYmGcP9 (提取码:e97a)
WebAPI2使用Autofac实现IOC属性注入完美解决方案相关推荐
- ASP.NET Core 2.0使用Autofac实现IOC依赖注入竟然能如此的优雅简便
初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通的.这是因为其使用了依赖注入 (DI) 的软件设计模式,代码的设计是遵循着"高内聚.低耦合 ...
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
上一篇ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器) ,我们说过ASP.NET Core中自带的IOC容器是属于轻量级的,功能并不是很多,只是提供了基础 ...
- Spring(三)——HelloSpring、IOC创建对象的方式、属性注入、自动装配、使用注解开发
文章目录 1. 简介 2. IOC理论推导 3. HelloSpring 4. IOC创建对象的方式 4.1 使用无参构造创建对象(默认) 4.2 使用有参构造创建对象 5. Spring配置 5.1 ...
- Autofac - 属性注入
属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA {p ...
- 一起写框架-Ioc内核容器的实现-对象的调用-属性注入容器的对象(十)
实现功能 需求:在类的成员属性使用@Autowirde注解注入容器中的对象. 实现思路 要实现这个功能.我们首先要思考一个问题:类与类的关系是在调用的建立的,还是说在创建对象的时候就就将建立了? -- ...
- core控制器属性注入的用处_asp.net-core – 如何使用Autofac和ASP.NET Core在控制器上启用属性注入?...
是的,为具有autofac的控制器设置属性注入有点棘手;)但这是它的工作原理. 使用ASP.NET Core(2.1),您首先需要在Startup.cs中将控制器注册为服务: services.Add ...
- core控制器属性注入的用处_.NET Core原生DI扩展之属性注入实现
在上一篇博客里,我们为.NET Core原生DI扩展了基于名称的注入功能.而今天,我们要来聊一聊属性注入.关于属性注入,历来争议不断,支持派认为,构造函数注入会让构造函数变得冗余,其立意点主要在代码的 ...
- asp.net core 3.1和 .Net 5.0中使用AutoFac作为IoC容器组件
一.为啥要使用第3方依赖注入框架 ? 1.微软官方提供的依赖注入框架已经很强大,一般情况无需第3方DI容器: 2.但是在一些特殊情况,需要第3方DI容器增强依赖注入功能,一般有如下几种情况: (1) ...
- 005_Spring的属性注入
1. DI依赖注入, 前提必须有IOC的环境, Spring管理这个类的时候将类的依赖的属性注入(设置)进来. 2. Spring的属性注入 2.1. 构造方法的方式的属性注入 2.2. Set方法的 ...
- spring项目属性注入和bean管理xml 注入一般属性和集合属性
IOC 介绍: 在Spring的应用中,Spring IoC容器可以创建.装配和配置应用组件对象,这里的组件对象称为Bean. Bean的实例化 在面向对象编程中,想使用某个对象时,需要事先实例化该对 ...
最新文章
- Python实现线程池
- Silverlight+WCF 实战-网络象棋最终篇之非线程阻塞倒计时窗口(四)
- 编程隐藏child指定列_简单的Excel VBA编程问题解答——完美Excel第183周小结
- 华为p20支持手机云闪付吗_华为官宣7款旗舰支持升级EMUI10.132系统,你的手机有份吗?...
- XPath CheatSheet
- webapi 路由限制命名控件_什么是命名数据网络NDN?
- 在ubuntu 下 编译 在windows 下面使用的adb
- java线程池_Java 线程池 8 大拒绝策略,面试必问!
- WhatsApp拟取消服务订阅年费
- bootstrap项目中无间距栅格(grid) no-gutter
- 大篆汉字对照表_篆书隶书千字对照表(一)
- RQNOJ 34 紧急援救
- 昆腾公司稍感安慰:向外扩展存储业务营收有所提升
- 2016百度笔试题交流
- 文件服务器 excle 变为temp,WPS的excel表格保存之后变成tmp_共享文档无法保存EXCLE 生成TMP...
- 得到大学夏季开学典礼之后感
- 有关mean iou 言简意赅的介绍 及python 代码实现
- JDBC心得体会--总结
- Android Wi-Fi 四次握手简介
- 所有手机中的「北斗导航」应用,都是山寨货