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的实例化 在面向对象编程中,想使用某个对象时,需要事先实例化该对 ...
最新文章
- 在node.js中一次读取一行文件?
- 算法:验证二叉搜索树
- Python语言学习之字母L开头函数使用集锦:logging日志用法之详细攻略
- 安卓逆向工具apkide安装
- 06 | 全局锁和表锁 : 给表加个字段怎么有这么多阻碍
- javaweb学习总结(十八):JSP属性范围
- PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
- 马云的妻子张瑛有多优秀?
- [渝粤教育] 天水师范学院 GNSS测量原理及其应用 参考 资料
- php 3种常见设计模式
- 文献补充材料怎么下载?
- VS 2015社区版离线下载
- 网页设计与制作教程(第2版)刘瑞斯+课本演练代码
- Foxmail设置雅虎邮箱的方法
- AngularJS【初体验】-02
- java 微服务 dubbo_Dubbo Spring Cloud 重塑微服务治理
- chromium目录下各个dll的作用
- 新书问答:Software Wasteland
- 解决禅道(ZenTao)Mysql启动不了的问题
- Excel自动化办公(一) | 满足你对Excel数据的所有幻想,python-office一键生成模拟数据