【2019】IOC依赖注入

5 篇文章 0 订阅
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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fengzhilu000

送人玫瑰,手留余香!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值