在这一篇文章将会讲解如何在Web API2中使用Autofac实现依赖注入。

一、创建实体类库

1、创建单独实体类

创建DI.Entity类库,用来存放所有的实体类,新建用户实体类,其结构如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DI.Entity
{
public class UserEntity
{
public int UserId { get; set; } public string UserName { get; set; } public int Sex { get; set; } public int Age { get; set; }
}
}

二、创建仓储接口类库

新建DI.Interface类库文件,存放所有接口,IUserRepository接口定义如下:

using DI.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DI.Interface
{
public interface IUserRepository
{
List<UserEntity> GetUsers();
}
}

三、创建仓储接口的实现类库

1、SQL Server数据库实现

新建DI.SqlServer类库文件,SqlServerUserRepository实现IUserRepository接口,SqlServerUserRepository类定义如下:

using DI.Entity;
using DI.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DI.SqlServer
{
public class SqlServerUserRepository : IUserRepository
{
public List<UserEntity> GetUsers()
{
List<UserEntity> list = new List<UserEntity>()
{
new UserEntity(){UserId=,UserName="王五",Sex=,Age=},
new UserEntity(){UserId=,UserName="赵六",Sex=,Age=},
}; return list;
}
}
}

2、Oracle数据库实现

新建DI.Oracle类库文件,OracleUserRepository实现IUserRepository接口,OracleUserRepository类定义如下:

using DI.Entity;
using DI.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DI.Oracle
{
public class OracleUserRepository : IUserRepository
{
public List<UserEntity> GetUsers()
{
List<UserEntity> list = new List<UserEntity>()
{
new UserEntity(){UserId=,UserName="张三",Sex=,Age=},
new UserEntity(){UserId=,UserName="李四",Sex=,Age=},
}; return list;
}
}
}

四、新建WebAPI项目

1、安装依赖项

通过NuGet安装所需的依赖项:Autofac、Autofac.WebApi2(如果使用的是WebApi1,这里需要安装WebApi)。

2、创建AutofacWebApiConfig类

AutofacWebApiConfig类定义如下:

using Autofac;
using Autofac.Integration.WebApi;
using DI.Interface;
using DI.SqlServer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Http; namespace WebApi.AutofacDI
{
public class AutofacWebApiConfig
{
public static void RegisterDependencies()
{
SetAutofacWebapi();
} private static void SetAutofacWebapi()
{
ContainerBuilder builder = new ContainerBuilder();
HttpConfiguration config = GlobalConfiguration.Configuration;
// Register API controllers using assembly scanning.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces();
// 使用SQLserver数据库实现
builder.RegisterType<SqlServerUserRepository>().As<IUserRepository>().InstancePerRequest();
var container = builder.Build();
// Set the WebApi dependency resolver.
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
}
}

3、修改Global.asax文件

修改后的Global.asax文件定义如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using WebApi.AutofacDI; namespace WebApi
{
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); // 配置依赖注入
AutofacWebApiConfig.RegisterDependencies();
}
}
}

4、创建Users控制器

创建UsersController类,并在构造函数中注入,UsersController类定义如下:

using DI.Entity;
using DI.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http; namespace WebApi.Controllers
{
public class UsersController : ApiController
{
private IUserRepository _userRepository; /// <summary>
/// 构造函数中注入
/// </summary>
/// <param name="userRepository"></param>
public UsersController(IUserRepository userRepository)
{
this._userRepository = userRepository;
} public IHttpActionResult Get()
{
return Json <List<UserEntity>>( _userRepository.GetUsers());
}
}
}

5、测试

启动程序,然后在浏览器里面输入:http://localhost:51157/api/users,结果如下:

从结果中可以看出:这里使用的是SQLserver实现的。

修改AutofacWebApiConfig文件,用oracle实现,修改后的代码如下:

using Autofac;
using Autofac.Integration.WebApi;
using DI.Interface;
using DI.Oracle;
using DI.SqlServer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Http; namespace WebApi.AutofacDI
{
public class AutofacWebApiConfig
{
public static void RegisterDependencies()
{
SetAutofacWebapi();
} private static void SetAutofacWebapi()
{
ContainerBuilder builder = new ContainerBuilder();
HttpConfiguration config = GlobalConfiguration.Configuration;
// Register API controllers using assembly scanning.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces();
// 使用SQLserver数据库实现
//builder.RegisterType<SqlServerUserRepository>().As<IUserRepository>().InstancePerRequest();
// 使用oracle数据库实现
builder.RegisterType<OracleUserRepository>().As<IUserRepository>().InstancePerRequest();
var container = builder.Build();
// Set the WebApi dependency resolver.
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
}
}

运行结果:

从结果中可以看出:这里使用的是oracle实现的。

五、将Autofac的实现放到单独的类库中

新建DI.Server类库,将Autofac的注册单独放在类库中,AutofacWebApiConfig类定义如下:

using Autofac;
using Autofac.Integration.WebApi;
using DI.Interface;
using DI.SqlServer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Mvc; namespace DI.Server
{
public class AutofacWebApiConfig
{
public static void RegisterDependencies()
{
SetAutofacWebapi();
} private static void SetAutofacWebapi()
{
ContainerBuilder builder = new ContainerBuilder();
HttpConfiguration config = GlobalConfiguration.Configuration;
// Register API controllers using assembly scanning.
builder.RegisterApiControllers(Assembly.LoadFrom(@"F:\Practice\WebAPI\WebApi依赖注入\DI\WebApiDIDemo\WebApi\bin\WebApi.dll"));
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces();
builder.RegisterType<SqlServerUserRepository>().As<IUserRepository>().InstancePerRequest();
var container = builder.Build();
// Set the WebApi dependency resolver.
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
}
}

注意:

如果是在单独的类库项目中,注册Api控制器的时候要加载WebApi项目所有的程序集文件,不要使用builder.RegisterApiControllers(Assembly.GetExecutingAssembly()),这里找到的当前程序集是类库文件,不是WebApi项目的程序集文件,在控制器里面不会实现注入。

2、修改Global.asax文件

修改后的Global.asax文件定义如下:

using DI.Server;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing; namespace WebApi
{
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); // 配置依赖注入(注意:这里使用的是单独类库里面的AutofacWebApiConfig类)
AutofacWebApiConfig.RegisterDependencies();
}
}
}

运行程序,效果和上面的一样。

Web API(六):使用Autofac实现依赖注入的更多相关文章

  1. angular2系列教程(八)In-memory web api、HTTP服务、依赖注入、Observable

    大家好,今天我们要讲是angular2的http功能模块,这个功能模块的代码不在angular2里面,需要我们另外引入: index.html <script src="lib/htt ...

  2. 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入

    系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...

  3. NopCommerce使用Autofac实现依赖注入

    NopCommerce的依赖注入是用的AutoFac组件,这个组件在nuget可以获取,而IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入.Setter注入和构造函数 ...

  4. SimpleInjector与MVC4集成,与Web Api集成,以及通过属性注入演示

    SimpleInjector与MVC4集成,与Web Api集成,以及通过属性注入演示   1,与MVC集成 见http://simpleinjector.codeplex.com/wikipage? ...

  5. Autofac之依赖注入

    这里主要学习一下Autofac的依赖注入方式 默认构造函数注入 class A { public B _b; public A() { } public A(B b) { this._b = b; } ...

  6. NET Core源代码通过Autofac实现依赖注入

    查看.NET Core源代码通过Autofac实现依赖注入到Controller属性   阅读目录 一.前言 二.使用Autofac 三.最后 回到目录 一.前言 在之前的文章[ASP.NET Cor ...

  7. Asp.Net Mvc使用Autofac实现依赖注入

    在asp.net mvc控制器中使用Autofac来解析依赖 如下Controller中使用构造函数依赖注入接口IPeople : public class AutoFacController : C ...

  8. 在asp.net web api 2 (ioc autofac) 使用 Serilog 记录日志

    Serilog是.net里面非常不错的记录日志的库,另外一个我认为比较好的Log库是NLog. 在我个人的asp.net web api 2 基础框架(Github地址)里,我原来使用的是NLog,但 ...

  9. Autofac 泛型依赖注入

    using Autofac;using Autofac.Extensions.DependencyInjection;using Hangfire;using Microsoft.AspNetCore ...

随机推荐

  1. Python——验证码识别 Pillow + tesseract-ocr

    至于安装教程在这里不再重复说了,可以参考博客,网上有大把的教程 https://blog.csdn.net/testcs_dn/article/details/78697730 要是别的验证码是如下类 ...

  2. Python 爬虫编码格式问题 gb2312转换utf8

    遇到的问题是:爬取网页得到的结果如下(部分)  里面的中文出现乱码. <!DOCTYPE html> <html lang='zh-CN'> <head> < ...

  3. activiti工作流之Eclipse的Eclipse BPMN 2.0 Designer无法安装或者(安装后无法重复打开*.bpmn)

    1.首先.既然学习activiti工作流,连官网和相应文件都没有下载就说不过去了 这是官网下载:http://www.activiti.org/download.html 2.对于下载后的activi ...

  4. MSSQL分组取后每一组的最新一条记录

    数据库中二张表,用户表和奖金记录表,奖金记录表中一个用户有多条信息,有一个生效时间,现在要查询: 奖金生效时间在三天前,每个用户取最新一条奖金记录,且用户末锁定 以前用的方法是直接写在C#代码中的: ...

  5. 【小白的CFD之旅】21 网格划分软件的选择

    但是怎样才能获得流体计算网格呢?“工欲善其事必先利其器”,画网格该用什么器呢?小白决定找黄师姐请教一番. 小白找到黄师姐的时候,黄师姐正在电脑上忙着. “黄师姐,我发现网格划分软件有好多种,究竟哪种才 ...

  6. (原创)用c++11打造好用的variant

    variant类似于union,它能代表定义的多种类型,允许将不同类型的值赋给它.它的具体类型是在初始化赋值时确定.boost中的variant的基本用法: typedef variant<in ...

  7. javascript基础拾遗(五)

    1.什么是箭头函数 ES6引入的一种新的函数,类似匿名函数,x=>xx 箭头左端为函数参数,右端为函数体 相当于 function (x){ retutn xx } 2.箭头函数的特点 更简洁 ...

  8. javascript基础拾遗(三)

    1.map数组映射操作 function add(x) { return x+1 } var nums = [1,3,5,7,9] result = nums.map(add) console.log ...

  9. 每日英语:Boost Your Balance; Avoid Falls

    If you find yourself needing to sit down to take off your shoes, it might be time to start paying at ...

  10. (转)Making 1 million requests with python-aiohttp

    转自:https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html Making 1 millio ...