ASP.NET MVC如何使用Unity實(shí)現(xiàn)Ioc詳解
為什么有這篇文章
最近在學(xué)ASP.NET MVC項(xiàng)目中使用Ioc,選用了Unity作為依賴注入的容器組件,在網(wǎng)上找了相關(guān)的文章簡單實(shí)現(xiàn)了依賴注入,但想用文件配置的方式進(jìn)行容器注入的注冊,發(fā)現(xiàn)相關(guān)的文章實(shí)現(xiàn)的方式不適用,因?yàn)榫W(wǎng)上的文章大多是使用Unity 4.0.1的版本,而目前最新的Unity版本是5.8.6,使用配置進(jìn)行容器注入的代碼已然不同。
Ioc和Unity
IOC(Inversion of Control),即“控制反轉(zhuǎn)”,是一種設(shè)計(jì)思想。有了IoC后,把創(chuàng)建和查找依賴對象的控制權(quán)交給了容器,由容器進(jìn)行注入組合對象,所以對象與對象之間是松散耦合,這樣也方便測試,利于功能復(fù)用,更重要的是使得程序的整個體系結(jié)構(gòu)變得非常靈活。
Unity是微軟Patterns & Practices 部門開發(fā)的一個輕量級的依賴注入容器。
代碼準(zhǔn)備
新建一個MVC項(xiàng)目,使用默認(rèn)命名WebApplication1。在Model中新建下面3個類:
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
public interface IUserDao
{
List<User> GetAllUsers();
}
public class EFUserDao : IUserDao
{
public List<User> GetAllUsers()
{
List<User> list = new List<User>();
//使用EF從數(shù)據(jù)庫中讀取數(shù)據(jù)...
return list;
}
}
HomeController中的Index()中編寫代碼:
using WebApplication1.Models;
public class HomeController : Controller
{
public ActionResult Index()
{
IUserDao dao = new EFUserDao();
var list = dao.GetAllUsers();
//do something...
return View();
}
}
以上代碼主要實(shí)現(xiàn)從數(shù)據(jù)庫中獲取用戶列表數(shù)據(jù)到控制器中。
使用Unity
在項(xiàng)目引用上右擊,管理Nuget程序包,搜索到Unity并安裝。

HomeController中代碼改動
using WebApplication1.Models;
using Unity;
public class HomeController : Controller
{
public ActionResult Index()
{
IUnityContainer container = new UnityContainer();
container.RegisterType<IUserDao, EFUserDao>();
var dao = container.Resolve<IUserDao>();
var list = dao.GetAllUsers();
//do something...
return View();
}
}
上面代碼先聲明一個Unity的容器,然后注冊所需要的對象,最后調(diào)用。
按上面的方式,每次使用GetAllUsers()前都需要聲明下,這里應(yīng)該封裝下。Unity在ASP.NET MVC中的使用已經(jīng)將代碼封裝好了。
ASP.NET MVC使用Unity
使用Nuget安裝Unity.MVC。

安裝完成后會在~/App_Start/目錄下自動生成UnityMvcActivator.cs和UnityConfig.cs文件。
打開UnityConfig文件,修改RegisterTypes()方法的代碼
public static void RegisterTypes(IUnityContainer container)
{
// NOTE: To load from web.config uncomment the line below.
// Make sure to add a Unity.Configuration to the using statements.
// container.LoadConfiguration();
// TODO: Register your type's mappings here.
container.RegisterType<IUserDao, EFUserDao>();
}
注意引用
using WebApplication1.Models;
修改HomeController代碼(使用構(gòu)造函數(shù)注入)
public class HomeController : Controller
{
IUserDao _iUserDao;
public HomeController(IUserDao iUserDao)
{
this._iUserDao = iUserDao;
}
public ActionResult Index()
{
var list = _iUserDao.GetAllUsers();
//do something...
return View();
}
}
此方式是將依賴注入寫在了代碼中。然而并不靈活,每添加一組類,都要在UnityConfig中進(jìn)行注冊并編譯一遍代碼。我們更需要的是在配置文件中注冊類型。
使用配置文件
修改UnityConfig文件中RegisterTypes()方法的代碼:
public static void RegisterTypes(IUnityContainer container)
{
// NOTE: To load from web.config uncomment the line below.
// Make sure to add a Unity.Configuration to the using statements.
container.LoadConfiguration();
// TODO: Register your type's mappings here.
// container.RegisterType<IUserDao, EFUserDao>();
}
需要引用
using Microsoft.Practices.Unity.Configuration;
更改Web.Config的配置:
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/> </configSections> <unity> <containers> <container> <types> <type type="WebApplication1.Models.IUserDao, WebApplication1" mapTo="WebApplication1.Models.EFUserDao, WebApplication1" /> </types> </container> </containers> </unity> ...... </configuration>
運(yùn)行站點(diǎn),成功獲取用戶列表數(shù)據(jù)。
擴(kuò)展
如果需求更改,要換用ADO.NET來操作數(shù)據(jù)庫,只要建一個SQLUserDao的類,繼承自IUserDao,然后將配置文件中的注冊類型修改即可
<type type="WebApplication1.Models.IUserDao, WebApplication1" mapTo="WebApplication1.Models.SQLUserDao, WebApplication1" />
筆者使用的是VS2017進(jìn)行操作。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
MVC文件上傳支持批量上傳拖拽及預(yù)覽文件內(nèi)容校驗(yàn)功能
這篇文章主要介紹了MVC文件上傳支持批量上傳拖拽及預(yù)覽文件內(nèi)容校驗(yàn)功能,需要的朋友可以參考下2017-03-03
.Net筆記:System.IO之windows文件操作的深入分析
本篇文章是對.Net中windows文件操作的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
關(guān)于Swagger優(yōu)化的實(shí)戰(zhàn)記錄
Swagger是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化?RESTful風(fēng)格的Web服務(wù),下面這篇文章主要給大家介紹了關(guān)于Swagger優(yōu)化的相關(guān)資料,需要的朋友可以參考下2022-04-04
ASP.NET Core 1.0 部署 HTTPS(.NET Core 1.0)
這篇文章主要為大家詳細(xì)介紹了ASP.NET Core 1.0 部署 HTTPS(.NET Core 1.0),感興趣的小伙伴們可以參考一下2016-07-07
asp.net Web Service 接口大量數(shù)據(jù)傳輸解決方案
就管他叫“使用多線程分段獲取大量數(shù)據(jù)方法”吧。假定我們的需求是,通過Web Service獲取10W條訂單,我的解決方案是 分成10個線程每個線程傳輸1W條訂單分段獲取2010-04-04
php基礎(chǔ)練習(xí)--簡單驗(yàn)證碼實(shí)現(xiàn)
這篇文章主要介紹了php基礎(chǔ)練習(xí)--簡單驗(yàn)證碼實(shí)現(xiàn),需要的朋友可以參考下2014-02-02

