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>