C#设计模式之依赖注入

以下是通过(IOC框架)Unity方式实现简单的依赖注入

1.定义公共接口

interface IBook
    {
        string GetName();
    }

2.创建两个类,继承自接口 IBook

class BookA : IBook
    {
        private string param;

        //带参构造函数
        public BookA(string param)
        {
            this.param = param;
        }
        public string GetName()
        {
            return this.param;
        }
    }

class BookB : IBook
    {
        public string GetName()
        {
            return "This BookB";
        }
    }

3.通过配置文件注册容器及指定主函数需要创建那个类(BookA/BookB)的对象

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="myunity"
          type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
  </configSections>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <myunity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <!--容器名称-->
    <container name="mycontainer">
      <!--BookA主要是为了展示带参构造调用方式  如果BookA提供的是无参的构造函数  直接修改一下配置项就能创建不同的对象-->
      <register type="ConsoleApplication17.IBook,ConsoleApplication17" mapTo="ConsoleApplication17.BookA,ConsoleApplication17"/>
      <!--<register type="ConsoleApplication17.IBook,ConsoleApplication17" mapTo="ConsoleApplication17.BookB,ConsoleApplication17"/>-->
    </container>
  </myunity>
</configuration>

4.主函数中调用

using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Unity;

namespace ConsoleApplication17
{
    class Program
    {
        static void Main(string[] args)
        {
            string obj;
            using (Microsoft.Practices.Unity.IUnityContainer container = new UnityContainer())
            {
                //不通过配置文件调用的方式
                //unity.RegisterType<IBook, BookA>();
                //unity.RegisterType<IBook, BookA>();
                //IBook book =unity.Resolve<IBook>();
                //obj = book.GetName();

                UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("myunity");
                //以下两行作用相同
                container.LoadConfiguration(section, "mycontainer");
                //section.Configure(container, "mycontainer");
                var list = new ParameterOverrides();
                list.Add("param", "踏浪帅2");
                //带参构造函数调用
                IBook book = container.Resolve<IBook>(list);
                //无参构造函数调用
                //IBook book = container.Resolve<IBook>();

                obj = book.GetName();
            }
            Console.WriteLine(obj);
            Console.ReadKey();
        }
    }
}

发布了15 篇原创文章 · 获赞 3 · 访问量 9536

猜你喜欢

转载自blog.csdn.net/weixin_38660590/article/details/88670627