Web API中使用Autofac實(shí)現(xiàn)依賴(lài)注入
一、創(chuàng)建實(shí)體類(lèi)庫(kù)
創(chuàng)建單獨(dú)實(shí)體類(lèi)
創(chuàng)建DI.Entity類(lèi)庫(kù),用來(lái)存放所有的實(shí)體類(lèi),新建用戶(hù)實(shí)體類(lèi),其結(jié)構(gòu)如下:
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; } } }
二、創(chuàng)建倉(cāng)儲(chǔ)接口類(lèi)庫(kù)
新建DI.Interface類(lèi)庫(kù)文件,存放所有接口,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(); } }
三、創(chuàng)建倉(cāng)儲(chǔ)接口的實(shí)現(xiàn)類(lèi)庫(kù)
1、SQL Server數(shù)據(jù)庫(kù)實(shí)現(xiàn)
新建DI.SqlServer類(lèi)庫(kù)文件,SqlServerUserRepository實(shí)現(xiàn)IUserRepository接口,SqlServerUserRepository類(lèi)定義如下:
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=1,UserName="王五",Sex=2,Age=21}, new UserEntity(){UserId=2,UserName="趙六",Sex=2,Age=23}, }; return list; } } }
2、Oracle數(shù)據(jù)庫(kù)實(shí)現(xiàn)
新建DI.Oracle類(lèi)庫(kù)文件,OracleUserRepository實(shí)現(xiàn)IUserRepository接口,OracleUserRepository類(lèi)定義如下:
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=1,UserName="張三",Sex=1,Age=24}, new UserEntity(){UserId=2,UserName="李四",Sex=1,Age=22}, }; return list; } } }
四、新建WebAPI項(xiàng)目
1、安裝依賴(lài)項(xiàng)
通過(guò)NuGet安裝所需的依賴(lài)項(xiàng):Autofac、Autofac.WebApi2(如果使用的是WebApi1,這里需要安裝WebApi)。
2、創(chuàng)建AutofacWebApiConfig類(lèi)
AutofacWebApiConfig類(lèi)定義如下:
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數(shù)據(jù)庫(kù)實(shí)現(xiàn) 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); // 配置依賴(lài)注入 AutofacWebApiConfig.RegisterDependencies(); } } }
4、創(chuàng)建Users控制器
創(chuàng)建UsersController類(lèi),并在構(gòu)造函數(shù)中注入,UsersController類(lèi)定義如下:
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> /// 構(gòu)造函數(shù)中注入 /// </summary> /// <param name="userRepository"></param> public UsersController(IUserRepository userRepository) { this._userRepository = userRepository; } public IHttpActionResult Get() { return Json <List<UserEntity>>( _userRepository.GetUsers()); } } }
5、測(cè)試
啟動(dòng)程序,然后在瀏覽器里面輸入:http://localhost:51157/api/users,結(jié)果如下:
從結(jié)果中可以看出:這里使用的是SQLserver實(shí)現(xiàn)的。
修改AutofacWebApiConfig文件,用oracle實(shí)現(xiàn),修改后的代碼如下:
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數(shù)據(jù)庫(kù)實(shí)現(xiàn) //builder.RegisterType<SqlServerUserRepository>().As<IUserRepository>().InstancePerRequest(); // 使用oracle數(shù)據(jù)庫(kù)實(shí)現(xiàn) builder.RegisterType<OracleUserRepository>().As<IUserRepository>().InstancePerRequest(); var container = builder.Build(); // Set the WebApi dependency resolver. config.DependencyResolver = new AutofacWebApiDependencyResolver(container); } } }
運(yùn)行結(jié)果:
從結(jié)果中可以看出:這里使用的是oracle實(shí)現(xiàn)的。
五、將Autofac的實(shí)現(xiàn)放到單獨(dú)的類(lèi)庫(kù)中
新建DI.Server類(lèi)庫(kù),將Autofac的注冊(cè)單獨(dú)放在類(lèi)庫(kù)中,AutofacWebApiConfig類(lèi)定義如下:
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依賴(lài)注入\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); } } }
注意:
如果是在單獨(dú)的類(lèi)庫(kù)項(xiàng)目中,注冊(cè)Api控制器的時(shí)候要加載WebApi項(xiàng)目所有的程序集文件,不要使用builder.RegisterApiControllers(Assembly.GetExecutingAssembly()),這里找到的當(dāng)前程序集是類(lèi)庫(kù)文件,不是WebApi項(xiàng)目的程序集文件,在控制器里面不會(huì)實(shí)現(xiàn)注入。
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); // 配置依賴(lài)注入(注意:這里使用的是單獨(dú)類(lèi)庫(kù)里面的AutofacWebApiConfig類(lèi)) AutofacWebApiConfig.RegisterDependencies(); } } }
運(yùn)行程序,效果和上面的一樣。
到此這篇關(guān)于Web API中使用Autofac實(shí)現(xiàn)依賴(lài)注入的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
.NET內(nèi)存泄漏分析Windbg項(xiàng)目實(shí)例
這篇文章介紹了.NET內(nèi)存泄漏分析Windbg項(xiàng)目實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12點(diǎn)擊圖片,AJAX刪除后臺(tái)圖片文件的實(shí)現(xiàn)代碼(asp.net)
點(diǎn)擊頁(yè)面上的圖片,用jQuery的AJAX來(lái)刪除后臺(tái)真實(shí)的文件。2010-11-11實(shí)例講解.NET中資源文件的創(chuàng)建與使用
資源文件顧名思義就是存放資源的文件。資源文件在程序設(shè)計(jì)中有著自身獨(dú)特的優(yōu)勢(shì),他獨(dú)立于源程序,這樣資源文件就可以被多個(gè)程序使用2011-12-12.net設(shè)計(jì)模式之裝飾模式(Decorator)
這篇文章主要為大家詳細(xì)介紹了.net設(shè)計(jì)模式之裝飾模式Decorator,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06asp.net 使用Silverlight操作ASPNETDB數(shù)據(jù)庫(kù)
asp.net下使用Silverlight操作ASPNETDB數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼2010-01-01ASP.NET?MVC使用typeahead.js實(shí)現(xiàn)輸入智能提示功能
這篇文章介紹了ASP.NET?MVC使用typeahead.js實(shí)現(xiàn)輸入智能提示功能的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09.NET?6新特性試用之DateOnly和TimeOnly類(lèi)型
這篇文章主要介紹了.NET?6新特性試用之DateOnly和TimeOnly類(lèi)型,主要介紹DateOnly和TimeOnly類(lèi)型使用過(guò)程及存在的一些過(guò)程,需要的小伙伴可以參考一下2022-03-03asp.net 未能加載文件或程序集“XXX”或它的某一個(gè)依賴(lài)項(xiàng)。試圖加載格式不正確的程序。
運(yùn)行asp.net后提示未能加載文件或程序集“XXX”或它的某一個(gè)依賴(lài)項(xiàng)。試圖加載格式不正確的程序。2011-07-07