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>