博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Web API(六):使用Autofac实现依赖注入
阅读量:6504 次
发布时间:2019-06-24

本文共 8740 字,大约阅读时间需要 29 分钟。

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

一、创建实体类库

1、创建单独实体类

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

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6  7 namespace DI.Entity 8 { 9     public class UserEntity10     {11         public int UserId { get; set; }12 13         public string UserName { get; set; }14 15         public int Sex { get; set; }16 17         public int Age { get; set; }18     }19 }

二、创建仓储接口类库

新建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
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
GetUsers() { List
list = new List
() { new UserEntity(){UserId=1,UserName="王五",Sex=2,Age=21}, new UserEntity(){UserId=2,UserName="赵六",Sex=2,Age=23}, }; 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
GetUsers() { List
list = new List
() { new UserEntity(){UserId=1,UserName="张三",Sex=1,Age=24}, new UserEntity(){UserId=2,UserName="李四",Sex=1,Age=22}, }; 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
().As
().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;        ///         /// 构造函数中注入        ///         ///         public UsersController(IUserRepository userRepository)        {            this._userRepository = userRepository;        }        public IHttpActionResult Get()        {            return Json 
>( _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
().As
().InstancePerRequest(); // 使用oracle数据库实现 builder.RegisterType
().As
().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
().As
().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();        }    }}

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

转载地址:http://immyo.baihongyu.com/

你可能感兴趣的文章
php des 加密解密实例
查看>>
【Mac】Mac键盘实现Home, End, Page UP, Page DOWN
查看>>
实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求
查看>>
安德鲁斯----多媒体编程
查看>>
swift版的元组
查看>>
[zz]在linux中出现there are stopped jobs 的解决方法
查看>>
Delphi下实现全屏快速找图找色 一、数据提取
查看>>
查询表字段信息
查看>>
logback与Log4J的区别
查看>>
关于机器学习的最佳科普文章:《从机器学习谈起》
查看>>
咏南新CS三层开发框架
查看>>
dxFlowChart运行时调出编辑器
查看>>
TDiocpCoderTcpServer返回数据记录有条数限制的问题
查看>>
NET Framework 3.0 (WinFX) RTM发布
查看>>
图片拼接器
查看>>
C++ TinyXml操作(含源码下载)
查看>>
读取swf里所有类定义
查看>>
DOWNLOAD 文件
查看>>
rp2833 网卡以及串口与接插件位置关系
查看>>
ogre场景图与场景内容分离
查看>>