Web API中使用Autofac實(shí)現(xiàn)依賴注入
一、創(chuàng)建實(shí)體類庫
創(chuàng)建單獨(dú)實(shí)體類
創(chuàng)建DI.Entity類庫,用來存放所有的實(shí)體類,新建用戶實(shí)體類,其結(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)建倉儲(chǔ)接口類庫
新建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();
}
}三、創(chuàng)建倉儲(chǔ)接口的實(shí)現(xiàn)類庫
1、SQL Server數(shù)據(jù)庫實(shí)現(xiàn)
新建DI.SqlServer類庫文件,SqlServerUserRepository實(shí)現(xiàn)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=1,UserName="王五",Sex=2,Age=21},
new UserEntity(){UserId=2,UserName="趙六",Sex=2,Age=23},
};
return list;
}
}
}2、Oracle數(shù)據(jù)庫實(shí)現(xiàn)
新建DI.Oracle類庫文件,OracleUserRepository實(shí)現(xiàn)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=1,UserName="張三",Sex=1,Age=24},
new UserEntity(){UserId=2,UserName="李四",Sex=1,Age=22},
};
return list;
}
}
}四、新建WebAPI項(xiàng)目
1、安裝依賴項(xiàng)
通過NuGet安裝所需的依賴項(xiàng):Autofac、Autofac.WebApi2(如果使用的是WebApi1,這里需要安裝WebApi)。
2、創(chuàng)建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數(shù)據(jù)庫實(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);
// 配置依賴注入
AutofacWebApiConfig.RegisterDependencies();
}
}
}4、創(chuàng)建Users控制器
創(chuàng)建UsersController類,并在構(gòu)造函數(shù)中注入,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>
/// 構(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ù)庫實(shí)現(xiàn)
//builder.RegisterType<SqlServerUserRepository>().As<IUserRepository>().InstancePerRequest();
// 使用oracle數(shù)據(jù)庫實(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ú)的類庫中
新建DI.Server類庫,將Autofac的注冊(cè)單獨(dú)放在類庫中,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);
}
}
}注意:
如果是在單獨(dú)的類庫項(xiàng)目中,注冊(cè)Api控制器的時(shí)候要加載WebApi項(xiàng)目所有的程序集文件,不要使用builder.RegisterApiControllers(Assembly.GetExecutingAssembly()),這里找到的當(dāng)前程序集是類庫文件,不是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);
// 配置依賴注入(注意:這里使用的是單獨(dú)類庫里面的AutofacWebApiConfig類)
AutofacWebApiConfig.RegisterDependencies();
}
}
}運(yùn)行程序,效果和上面的一樣。
到此這篇關(guān)于Web API中使用Autofac實(shí)現(xiàn)依賴注入的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net使用母版頁中使用ajax腳本取數(shù)據(jù)
因母版頁繼承自UserControl,我們無法像正常頁面那樣使用Jquey或Ajax的PageMethods等無刷新方法取數(shù)據(jù)。不過可以使用ajax提供的Sys.Net.WebRequest來解決這一問題。2010-09-09
datalist,Repeater和Gridview的區(qū)別分析
datalist,Repeater和Gridview的區(qū)別分析,需要的朋友可以參考一下2013-03-03
在ASP.NET中用存儲(chǔ)過程執(zhí)行SQL語句
存儲(chǔ)過程:是一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫中。用戶通過指定存儲(chǔ)過程的名字并給出參數(shù)(如果該存儲(chǔ)過程帶有參數(shù))來執(zhí)行它。存儲(chǔ)過程是數(shù)據(jù)庫中的一個(gè)重要對(duì)象,任何一個(gè)設(shè)計(jì)良好的數(shù)據(jù)庫應(yīng)用程序都應(yīng)該用到存儲(chǔ)過程。2010-04-04
asp.net StreamReader 創(chuàng)建文件的實(shí)例代碼
這篇文章介紹了asp.net StreamReader 創(chuàng)建文件的實(shí)例代碼,有需要的朋友可以參考一下2013-07-07
c# 讀取文件內(nèi)容存放到int數(shù)組 array.txt
c# 讀取文本的內(nèi)容,并且將內(nèi)容保存到int數(shù)組中,大家可以學(xué)習(xí)到c#一些數(shù)組跟讀取內(nèi)容的函數(shù)。2009-04-04
Win7安裝Visual Studio 2015失敗的解決方法
這篇文章主要為大家詳細(xì)介紹了Win7安裝Visual Studio 2015失敗的解決方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03

