乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       頭號碼甲 2020-04-25

      使用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了,但是在使用配置文件注入的時候,總是報以下錯誤,

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

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

      DAL層

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

      BLL層

      namespace BLL
      {
          //聲明一個Bll層接口
          public interface IA
          {
              string GetName();
          }
      }
      
      //實現(xiàn)1
      public class A1 : IA
      {
          IADao _a1;
      
          //構(gòu)造函數(shù)注入
          [InjectionConstructor]
          public A1(IADao a1)
          {
              _a1 = a1;
          }
      
          public string GetName()
          {
              return _a1.GetName();
          }
      }
      
      //實現(xiàn)2
      public class A2 : IA
      {
          //屬性注入 "a2dao" 是區(qū)分兩個不同實現(xiàn)的標(biāo)識,在配置文件中聲明該名稱
          [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)建一個注冊配置類UnityConfig (引用插件的時候會自動創(chuàng)建,自定義也可以),用來注冊配置文件Unity.config中的配置,

         /// <summary>
          /// 配置文件公用類
          /// </summary>
          public class UnityConfig
          {
              /// <summary>
              /// MVC注入  在全局方法中調(diào)用該方法,實現(xiàn)全局注冊
              /// </summary>
              public static void Start()
              {
                  var container = ApiContainer.GetUnityContainer();
                  RegisterTypes(container);
      
                  DependencyResolver.SetResolver(new UnityDependencyResolver(container));   //MVC注入
              }
      
              /// <summary>
              /// 使用配置文件注冊
              /// </summary>
              /// <param name="container"></param>
              private static void RegisterTypes(IUnityContainer container)
              {
                  //使用單獨的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)建一個UnityDependencyResolver 類,同時實現(xiàn)接口:IDependencyResolver

       1 /// <summary>
       2 /// 用于自動實現(xiàn)對象類
       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         try
      15         {
      16             return container.Resolve(serviceType);
      17         }
      18         catch
      19         {
      20             return null;
      21         }
      22     }
      23 
      24     public IEnumerable<object> GetServices(Type serviceType)
      25     {
      26         try
      27         {
      28             return container.ResolveAll(serviceType);
      29         }
      30         catch
      31         {
      32             return new List<object>();
      33         }
      34     }
      35 }

      4,寫一個Unity公共類,也可以將該類集成到項目中

          /// <summary>
          /// Unity公共類
          /// </summary>
          public class ApiContainer
          {
              private readonly static IUnityContainer _container = null;
      
              /// <summary>
              /// 初始化容器
              /// </summary>
              /// <returns></returns>
              static ApiContainer()
              {
                  //新建容器構(gòu)建器,用于注冊組件和服務(wù)
                  _container = new UnityContainer();
              }
      
              /// <summary>
              /// 對外開放函數(shù) 獲取Unity容器
              /// </summary>
              /// <returns></returns>
              public static IUnityContainer GetUnityContainer()
              {
                  return _container;
              }
      
              /// <summary>
              /// 獲取實例
              /// </summary>
              /// <typeparam name="T"></typeparam>
              /// <returns></returns>
              public static T GetServer<T>()
              {
                  return _container.Resolve<T>();
              }
      
              /// <summary>
              /// 可以根據(jù)ConfigName獲取實例
              /// </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">依賴對象</typeparam>
              /// <param name="ConfigName">配置文件中指定的文字(沒寫會報異常)</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,在項目根目錄下創(chuàng)建一個 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,在全局中注冊 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();   //全局注冊   可通過構(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 實現(xiàn)。API的不需要實現(xiàn)如下接口, 去掉如下圖的實現(xiàn)。

       

      其他的地方都一樣。

       

      參考文章:

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

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

       

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多