在这一篇文章将会讲解如何在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. excel文件导入mysql

    在数据处理的过程中,常常要把windows下的excel文件导入linux下的mysql.这其中会出现一些问题. 1.首先,要在mysql中建表.命令最好存在记事本中,可以随时修改,随时执行 crea ...

  2. 学习排序算法(一):单文档方法 Pointwise

    学习排序算法(一):单文档方法 Pointwise 1. 基本思想 这样的方法主要是将搜索结果的文档变为特征向量,然后将排序问题转化成了机器学习中的常规的分类问题,并且是个多类分类问题. 2. 方法流 ...

  3. quartz + spring 配置示例

    <!-- 配置job定时任务类 --> <bean id="triggerCalculateLecturerProfitJob" class="com. ...

  4. struts2(六) 文件上传和下载

    前面对文件下载提过一点点,这里正好要讲文件上传,就放在一起在说一遍. --WH 一.单文件上传 在没学struts2之前,我们要写文件上传,非常麻烦,需要手动一步步去获取表单中的各种属性,然后在进行相 ...

  5. ISO GPS定位,坐标转换以及如何显示

    这个写的公共类叫做:GPScombineClass类主要展示GPS位置的定位,GPS坐标的获取,然后从手机坐标转换成火星坐标,继而在需要的情况下,由火星转百度 ,百度转火星的详细算法:   在GPSc ...

  6. 行为类模式(五):中介者(Mediator)

    定义 定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互. 试想一下,如果多个类之间相互都有引用,那么当其中一个类修改 ...

  7. Linux系统Apache服务 - 配置 HTTP 的虚拟机主机

    接Linux系统Apache服务 - 配置HTTP的默认主页 1.创建/srv目录,作为httpd的文件目录,并创建/srv/default/www和/srv/www1.example.com/www ...

  8. vue监听浏览器窗口的变化,随着窗口变化调整里面table的宽高

    1.在data中设置: tableHeight:"500", screenHeight:window.innerHeight, 2.在mounted中设置: mounted() { ...

  9. js 去掉html标签

    方法一: /// <summary> /// 去除HTML标记 /// </summary> /// <param name="NoHTML"> ...

  10. AIX查看CPU、内存等信息

    AIX下查看CPUAIX操作系统AIX的硬件信息可以通过prtconf命令看到.1. 查看逻辑CPU个数#pmcycles -mCPU 0 runs at 4204 MHzCPU 1 runs at ...