【2019】IOC依賴注入

IOC依賴注入

API.Model
   public interface IMediaFile
   {
       string FilePath { get; set; }
   }
	public interface IPlayer
   {
       void Play(IMediaFile file);
   }
	public class MediaFile : IMediaFile
   {
       public string FilePath { get; set; }
   }
	public void Play(IMediaFile file)
	{
		Console.WriteLine(file.FilePath);
	}
API.IOC
using API.Model;
using Microsoft.Practices.Unity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace API.IOC
{
    public class IOCCommon
    {
        public static UnityContainer container = new UnityContainer();//創建容器

        IOCCommon()
        {
            container.RegisterType<IPlayer, Player>();//註冊依賴對象
            container.RegisterType<IMediaFile, MediaFile>();//註冊依賴對象
        }
    }
}
unity.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <!--unity程序集-->
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
  </configSections>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <!--<containers>-->
      <container name="defaultContainer">
        <!--<register type="命名空間.接口類型1,命名空間" mapTo="命名空間.實現類型1,命名空間" />
        <register type="命名空間.接口類型2,命名空間" mapTo="命名空間.實現類型2,命名空間" />--> 
        <register name="IPlayer" type="API.Model.IPlayer,API.Model" mapTo="API.Model.Player,API.Model">
          <lifetime type="singleton" />
        </register>
        <register name="IMediFile" type="API.Model.IMediFile,API.Model" mapTo="API.Model.MediFile,API.Model">
          <lifetime type="singleton" />
        </register>
      </container>
    <!--</containers>-->
  </unity>
</configuration>
命名空間

Microsoft.Practices.Unity.Configuration.dll
Microsoft.Practices.Unity.dll
Microsoft.Practices.Unity.Interception.Configuration.dll
Microsoft.Practices.Unity.Interception.dll
Microsoft.Practices.Unity.RegistrationByConvention.dll

API.Demo

using API.IOC;
using API.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;

namespace API.Demo
{
    public partial class AssemblyForm : Form
    {
        //static UnityContainer _unityContainer = new UnityContainer();
        IMediaFile _iMediaFile;
        IPlayer _iPlayer;
        
        //static UnityContainer container = new UnityContainer();
        public AssemblyForm()
        {
            InitializeComponent();
            #region general approach
            Player play = new Player();
            MediaFile mediaFile = new MediaFile() { FilePath = "Normal:I Love You!" };
            play.Play(mediaFile);
            #endregion
            #region init Data
            BindDataIOC_Dymic();
            BindDataIOC_Two();
            
            #endregion
            BindData();
        }

        /// <summary>
        /// reflector call 
        /// </summary>
        private void BindData()
        {
            string strDllPath = System.AppDomain.CurrentDomain.BaseDirectory + @"DAL.dll";
            //使用Load方法加載程序集,特別是強命名程序集,能在程序集上應用安全和部署策略,推薦使用該方法動態加載程序集,至於LoadFrom和LoadWithPartialName。
            Assembly assembly = Assembly.LoadFrom(strDllPath);
            if (assembly != null)
            {
                var types = assembly.GetTypes();
                MethodInfo Method = assembly.GetTypes()[4].GetMethod("Add");

                object obj = Activator.CreateInstance(assembly.GetTypes()[4]);
                Object[] arrObj = { 3, 1 };
                object kk = Method.Invoke(obj, arrObj);

                var instance = assembly.CreateInstance(types[4].FullName);
            }
        }

        private void BindDataIOC_One()
        {
            //IMediaFile _mtype = new MediaFile();
            //IPlayer _player = new Player();
            //_player.Play(_mtype);
            #region COnfig To Dynamic
            //IMediaFile _mtype = (MediaFile)Assembly.Load(ConfigurationManager.AppSettings["AssemName"]).CreateInstance(ConfigurationManager.AppSettings["MediaName"]);
            //IPlayer _player = (Player)Assembly.Load(ConfigurationManager.AppSettings["AssemName"]).CreateInstance(ConfigurationManager.AppSettings["PlayerName"]);
            //_player.Play(_mtype);
            #endregion
        }

        private void BindDataIOC_Two()
        {
            this._iPlayer = (IPlayer)IOCCommon.container.Resolve<Player>();
            this._iMediaFile = (MediaFile)IOCCommon.container.Resolve<MediaFile>();
            _iMediaFile.FilePath = "IOC:I Love You!";
            _iPlayer.Play(_iMediaFile);
        }

        private void BindDataIOC_Dymic()
        {
            IUnityContainer container = new UnityContainer();//創建容器

            #region MethodOne
            //unity.config絕對路徑
            //var fileMap = new System.Configuration.ExeConfigurationFileMap() { ExeConfigFilename = @"D:\Users\WH1902002\source\repos\GeneralDemo\API.Demo\bin\Debug\Unity.config" };
            //Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
            //var section = (UnityConfigurationSection)configuration.GetSection("unity");
            //container = new UnityContainer().LoadConfiguration(section, "defaultContainer");
            #endregion

            #region MethodTwo
            //依賴關係可以選擇代碼形式,也可以用配置文件的形式
            //config
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName);
            container = new UnityContainer().LoadConfiguration(section, "defaultContainer");
            #endregion

            this._iPlayer = (IPlayer)IOCCommon.container.Resolve<Player>();//返回調用者
            this._iMediaFile = (MediaFile)IOCCommon.container.Resolve<MediaFile>();//返回調用者
            _iMediaFile.FilePath = "I Love You!";
            _iPlayer.Play(_iMediaFile);
        }
    }
}
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <!--unity程序集-->
   <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup> 
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <container name="defaultContainer">
      <!--<register type="命名空間.接口類型1,命名空間" mapTo="命名空間.實現類型1,命名空間" />
        <register type="命名空間.接口類型2,命名空間" mapTo="命名空間.實現類型2,命名空間" />-->
      <register name="IPlayer" type="API.Model.IPlayer,API.Model" mapTo="API.Model.Player,API.Model">
        <lifetime type="singleton" />
      </register>
      <register name="IMediaFile" type="API.Model.IMediaFile,API.Model" mapTo="API.Model.MediaFile,API.Model">
        <lifetime type="singleton" />
      </register>
    </container>
  </unity>
</configuration>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章