免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Ioc依賴注入:Unity4.0.1 在項(xiàng)目中的應(yīng)用 (MVC和API)

使用Unity的好處網(wǎng)上有很多,百度一下即可

這里引用了一篇關(guān)于面向接口編程的好處的文章作為引申:https://blog.csdn.net/Cyy19970527/article/details/83177996

在MVC中使用Unity

需要引用Unity包,我安裝的版本為 Unity-4.0.1

盡管現(xiàn)在Unity最新版本已經(jīng)更新到5.11.2了,但是在使用配置文件注入的時(shí)候,總是報(bào)以下錯(cuò)誤,

百度查找到一篇文章說是版本問題: https://blog.csdn.net/weixin_34124577/article/details/93533679

接下來直接上測(cè)試代碼:項(xiàng)目結(jié)構(gòu)使用簡(jiǎn)單的三層結(jié)構(gòu)

DAL層

namespace DAL{    //聲明一個(gè)接口層,獲取名稱    public interface IADao    {        string GetName();    }}//實(shí)現(xiàn)1public class A1Dao : IADao{    public string GetName()    {        return "我叫A1";    }}//實(shí)現(xiàn)2public class A2Dao : IADao{    public string GetName()    {        return "我叫A2";    }}

BLL層

namespace BLL{    //聲明一個(gè)Bll層接口    public interface IA    {        string GetName();    }}//實(shí)現(xiàn)1public class A1 : IA{    IADao _a1;    //構(gòu)造函數(shù)注入    [InjectionConstructor]    public A1(IADao a1)    {        _a1 = a1;    }    public string GetName()    {        return _a1.GetName();    }}//實(shí)現(xiàn)2public class A2 : IA{    //屬性注入 "a2dao" 是區(qū)分兩個(gè)不同實(shí)現(xiàn)的標(biāo)識(shí),在配置文件中聲明該名稱    [Dependency("a2dao")]    public DAL.IADao _a1 { get; set; }    public string GetName()    {        return _a1.GetName();    }}

在控制器中調(diào)用

public class HomeController : Controller{    //通過屬性注入    [Dependency("a2")]    public IA _a2 { get; set; }    private IA _ia;    
//構(gòu)造函數(shù)注入 [InjectionConstructor]
public HomeController(IA ia) //如果都通過構(gòu)造函數(shù)注入,則通過該方式區(qū)分([Dependency("a1")]IA a1,[Dependency("a2")]IA a2) { _ia = ia; } public ActionResult Index() { ViewBag.Name = _ia.GetName(); //通過構(gòu)造函數(shù)注入獲取 ViewBag.A2Name = _a2.GetName(); //通過屬性注入獲取 return View(); }}

顯示結(jié)果:

接下來說如何配置

1,首先要引用Unity插件

2,然后在App_Start 文件夾下創(chuàng)建一個(gè)注冊(cè)配置類UnityConfig (引用插件的時(shí)候會(huì)自動(dòng)創(chuàng)建,自定義也可以),用來注冊(cè)配置文件Unity.config中的配置,

   /// <summary>    /// 配置文件公用類    /// </summary>    public class UnityConfig    {        /// <summary>        /// MVC注入  在全局方法中調(diào)用該方法,實(shí)現(xiàn)全局注冊(cè)        /// </summary>        public static void Start()        {            var container = ApiContainer.GetUnityContainer();            RegisterTypes(container);            DependencyResolver.SetResolver(new UnityDependencyResolver(container));   //MVC注入        }        /// <summary>        /// 使用配置文件注冊(cè)        /// </summary>        /// <param name="container"></param>        private static void RegisterTypes(IUnityContainer container)        {            //使用單獨(dú)的Unity.config配置文件            var filepath = HttpRuntime.AppDomainAppPath;            var context = HttpContext.Current;            if (context != null)            {                filepath = context.Server.MapPath("~/");            }            var getfile = filepath + "Unity.config";            var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = getfile };            Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);            var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");            container.LoadConfiguration(unitySection, "defaultContainer");            //在App.config或者Web.Config中配置            //UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");            //container.LoadConfiguration(section, "defaultContainer");  //或者section.Configure(container, "defaultContainer");        }    }

 3,然后同樣在App_Start 文件夾下創(chuàng)建一個(gè)UnityDependencyResolver 類,同時(shí)實(shí)現(xiàn)接口:IDependencyResolver

 1 /// <summary> 2 /// 用于自動(dòng)實(shí)現(xiàn)對(duì)象類 3 /// </summary> 4 public class UnityDependencyResolver : IDependencyResolver 5 { 6     IUnityContainer container; 7     public UnityDependencyResolver(IUnityContainer container) 8     { 9         this.container = container;10     }11 12     public object GetService(Type serviceType)13     {14         try15         {16             return container.Resolve(serviceType);17         }18         catch19         {20             return null;21         }22     }23 24     public IEnumerable<object> GetServices(Type serviceType)25     {26         try27         {28             return container.ResolveAll(serviceType);29         }30         catch31         {32             return new List<object>();33         }34     }35 }

4,寫一個(gè)Unity公共類,也可以將該類集成到項(xiàng)目中

    /// <summary>    /// Unity公共類    /// </summary>    public class ApiContainer    {        private readonly static IUnityContainer _container = null;        /// <summary>        /// 初始化容器        /// </summary>        /// <returns></returns>        static ApiContainer()        {            //新建容器構(gòu)建器,用于注冊(cè)組件和服務(wù)            _container = new UnityContainer();        }        /// <summary>        /// 對(duì)外開放函數(shù) 獲取Unity容器        /// </summary>        /// <returns></returns>        public static IUnityContainer GetUnityContainer()        {            return _container;        }        /// <summary>        /// 獲取實(shí)例        /// </summary>        /// <typeparam name="T"></typeparam>        /// <returns></returns>        public static T GetServer<T>()        {            return _container.Resolve<T>();        }        /// <summary>        /// 可以根據(jù)ConfigName獲取實(shí)例        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="ConfigName">配置文件中指定的文字</param>        /// <returns></returns>        public static T GetServer<T>(string ConfigName)        {            return _container.Resolve<T>(ConfigName);        }        /// <summary>        /// 返回構(gòu)結(jié)函數(shù)帶參數(shù)        /// </summary>        /// <typeparam name="T">依賴對(duì)象</typeparam>        /// <param name="ConfigName">配置文件中指定的文字(沒寫會(huì)報(bào)異常)</param>        /// <param name="parameterList">參數(shù)集合(參數(shù)名,參數(shù)值)</param>        /// <returns></returns>        public static T GetServer<T>(Dictionary<string, object> parameterList)        {            var list = new ParameterOverrides();            foreach (KeyValuePair<string, object> item in parameterList)            {                list.Add(item.Key, item.Value);            }            return _container.Resolve<T>(list.OnType<T>());        }    }

5,在項(xiàng)目根目錄下創(chuàng)建一個(gè) Unity.config 文件,配置如下

<?xml version="1.0" encoding="utf-8"?><configuration>  <configSections>    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>  </configSections>  <unity>    <containers>      <container name="defaultContainer">        <register type="BLL.IA,BLL" mapTo="BLL.A1, BLL"/>        <register type="BLL.IA,BLL" mapTo="BLL.A2, BLL"  name="a2" />        <register type="DAL.IADao,DAL" mapTo="DAL.A1Dao, DAL"/>        <register type="DAL.IADao,DAL" mapTo="DAL.A2Dao, DAL" name="a2dao"/>      </container>    </containers>  </unity></configuration>

6,在全局中注冊(cè) Global.asax.cs

public class MvcApplication : System.Web.HttpApplication{    protected void Application_Start()    {        AreaRegistration.RegisterAllAreas();        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);        RouteConfig.RegisterRoutes(RouteTable.Routes);        BundleConfig.RegisterBundles(BundleTable.Bundles);        UnityConfig.Start();   //全局注冊(cè)   可通過構(gòu)造函數(shù)or屬性調(diào)用    }}

到此全部結(jié)束

如果要在 WebAPI中使用Unity,則除了引用Unity插件,還要引用 Unity.WebApI 插件,引用版本如下:

然后需要調(diào)整一處地方,將MVC的注入方式換成WebAPI的注入方式,如下:

using System;using Microsoft.Practices.Unity;using Microsoft.Practices.Unity.WebApi;using System.Web.Http;
namespace API.App_Start{ /// <summary> /// 配置文件公用類 /// </summary> public class UnityConfig { public static void Start() {
//DependencyResolver.SetResolver(new UnityDependencyResolver(container));   //MVC注入方式
GlobalConfiguration.Configuration.DependencyResolver
= new UnityDependencyResolver(GetConfiguredContainer()); //API注入方式 }
}}

 另外需要去掉上邊代碼中的 UnityDependencyResolver : IDependencyResolver 實(shí)現(xiàn)。API的不需要實(shí)現(xiàn)如下接口, 去掉如下圖的實(shí)現(xiàn)。

 

其他的地方都一樣。

 

參考文章:

https://www.cnblogs.com/qqlin/archive/2012/10/18/2720828.html

https://blog.csdn.net/hezheqiang/article/details/80255280

 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
小議傳統(tǒng)分層與新式分層,抑或與DDD分層
一個(gè)簡(jiǎn)單的小程序演示Unity的三種依賴注入方式
C#三層架構(gòu)詳解
ASp.net 剖析三層架構(gòu)(2)
BLL 業(yè)務(wù)邏輯層代碼生成器
c# – Mapper已初始化
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服