前面學習了autofac這個依賴注入組件,原本是打算寫在一塊兒的,由於這個組件沒打算像autofac同樣詳細的寫,只是寫下之前本身鼓搗玩搭建框架而後使用的一個依賴注入組件,而且也是進行了封裝使用。不打算做爲學習知識,僅做爲使用封裝記錄的。html
沒想autofac寫着寫着篇幅有點長,就單獨看成一個封裝類記錄一下吧。技術就和東西差很少長時間不使用就容易忘記。web
上一篇autofac地址:【AutoFac】依賴注入和控制反轉的使用mvc
別的不說引用仍是要簡單說一下的,在使用前要引用dll:框架
我這裏是把Unity組件和項目業務進行了分層全部我這個組件至關於在一個獨立的項目中,單獨的封裝到了IOC文件夾下建立,這裏不介紹整個解決方案了只對這個介紹下,大體的結構以下:ide
這個是主要類,容器的注入和獲取容器裏面的類至關於Unity的入口調用和請求都經過他,這個封裝有一個好處就是統一調用(廢話)。post
/// <summary>
/// 依賴注入之區域注入方式
/// 沒有寫入到配置文件可傳參注入
/// </summary>
public class Ioc
{
private static readonly UnityContainer _container; static Ioc() { _container = new UnityContainer(); } public static void RegisterInheritedTypes(Assembly assembly, Type baseType) { _container.RegisterInheritedTypes(assembly, baseType); } public static void Register<TInterface, TImplementation>() where TImplementation : TInterface { _container.RegisterType<TInterface, TImplementation>(); } public static T Get<T>() { return _container.Resolve<T>(); } }
而後有一個Unity擴展註冊方法:學習
public static class UnityContainerExtensions
{
/// <summary>
/// Unity擴展註冊方法
/// </summary>
/// <param name="container"></param>
/// <param name="assembly"></param>
/// <param name="baseType"></param>
public static void RegisterInheritedTypes(this IUnityContainer container, Assembly assembly, Type baseType) { var allTypes = assembly.GetTypes(); var baseInterfaces = baseType.GetInterfaces(); foreach (var type in allTypes) { if (type.BaseType != null && type.BaseType.GenericEq(baseType)) { var typeInterface = type.GetInterfaces().FirstOrDefault(x => !baseInterfaces.Any(bi => bi.GenericEq(x))); if (typeInterface == null) { continue; } container.RegisterType(typeInterface, type); } } } }
這個很關鍵哦,這裏再說下我這裏其實不是每一個類都要寫一遍註冊,而是全部業務類繼承於一個底層抽象類ServiceBase。而後傳入程序集和類型,就會把當前程序集下的全部這個類型註冊進去。測試
例如我有UserServer和UserServerTwo兩個業務類,我讓他都繼承ServiceBase抽象類,固然他們仍然要實現本身的服務接口的就拿UserServer舉例吧:this
這樣我到時候使用只須要註冊一遍就把這兩個服務同時注入了。什麼好處在哪裏,第一註冊代碼寫少了,第二實現區域化分類。url
使用根據mvc的控制器區域進行單獨註冊便可:
public override void RegisterArea(AreaRegistrationContext context)
{
//註冊使用代碼,先註冊後使用
Ioc.RegisterInheritedTypes(typeof(Server_Areas.Admin.IUserServer).Assembly, typeof(ServiceBase)); context.MapRoute( "AdminAreas_default", "AdminAreas/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional }, new string[] { "LayerFrame.Areas." + this.AreaName + ".Controllers" } ); }
而後在該區域控制器使用:
public ActionResult Index()
{
//測試日誌
LogHelp.WriteFile("deBug", "這是日誌輸出哦"); //數據操做 var service = Ioc.Get<Server_Areas.Admin.IUserServer>(); //添加數據 UserInfor user = new UserInfor(); user.userAccount = "test001"; user.userPwd = "123456"; user.userPhone = "0530123456"; user.userRealName = "真實姓名"; user.userSex = 0; user.userPhone = "0530123456"; user.userRemark = "備註內容"; user.addTime = DateTime.Now; int count = service.UserAdd(user); var data= service.GetData(); ViewBag.data = service.GetData(); return View(); }
每次注入服務類是很麻煩的,好比修改了增長了,總不能一直去修改代碼吧,老是很差的,因此咱們也能夠寫到配置文件統一管理,比較方便(其實我上面封裝的也很方便了)。這個比上面好的是在於不用進行區域註冊了。所有統一註冊了。
這裏我又一個地方是使用了之前的一篇【Config】類庫讀取本身的配置文件,配置文件的擴展,因此我是單獨在IOC文件夾下建立了對應的web.config文件,若是寫在項目跟web.config文件把註釋那句話取消便可。
public class UnityFactory
{
private static IUnityContainer _iUnityContainer = null; private UnityFactory() { } static UnityFactory() { ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); string basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "IOC\\Unity.Config"); Configuration configuration = LibConfig.InitConfig("IOC\\Unity"); UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName); // UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName); _iUnityContainer = new UnityContainer(); try { section.Configure(_iUnityContainer, "MyContainer"); } catch (Exception e) { throw; } } public static IUnityContainer GetContainerInstance() { return _iUnityContainer; } public static T GetServer<T>() { try { return _iUnityContainer.Resolve<T>(); } catch (Exception e) { throw; } } }
使用就特別簡單啦:
public ActionResult Test() {
try { var service = UnityFactory.GetServer<Server_Areas.Admin.UserServer>(); var data = service.GetData(); } catch (Exception e) { } return View(); }