Unity依赖注入(构造器注入,属性注入[DependencyAttribute],方法注入[InjectionMethodAttribute])

依赖注入基础知识

Nuget引入Unity.Abstractions.dll(5.11.7.0)

依赖注入注册类型(可以通过lifetimeManager参数指定成单例等等):

  • Unity.UnityContainer.RegisterType
  • Unity.UnityContainer.RegisterInstance
  • Unity.UnityContainer.RegisterFactory 可以用方法指定解析类型时如何构造类型

解析类型:

  • Unity.UnityContainer.Resolve

UnityContainerExtensions还封装了以下等等扩展方法及泛型方法:

  • RegisterSingleton
  • RegisterSingleton〈T〉
  • ResolveAll
  • ResolveAll〈T〉

构造器注入的参数类型样式灵活多样

构造器注入的参数类型

  1. 可以是前面注册过的类型
  2. 可以是前面注册过的类型的IEnumerable类型
  3. 可以是得出前面注册过的类型委托类型,如Func〈Class1〉(前面可以是注册过Func〈Class1〉类型,也可以是注册过Class1类型)
  4. 可以是结合第2,3点,比如前面通过不同name参数注册了多个IServiceHost实例,后面在WcfWindowsService类中,当依赖解析实例时,就可以通过以下构造方法完成构造器注入Func〈IEnumerable〈IServiceHost〉〉类型的参数:
    public WcfWindowsService(Func〈IEnumerable〈IServiceHost〉〉 funcServiceHosts)
    {

    this.ServiceHosts = funcServiceHosts.Invoke(); //执行委托得到前面注册过的多个IServiceHost实例,多个组成IEnumerable〈IServiceHost〉类型

    }

以下为转载部分:

Unity依赖注入(构造器注入,属性注入[DependencyAttribute],方法注入[InjectionMethodAttribute]) : https://blog.csdn.net/litao2/article/details/80274734

框架 .NET Framework 4.5

dll文件:Microsoft.Practices.Unity.dll

Microsoft.Practices.Unity.Configuration.dll

dll下载地址:https://download.csdn.net/download/tiz198183/10406858

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System.Configuration;
namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

        //创建容器
        UnityContainer container = new UnityContainer();
        UnityConfigurationSection configuration = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection;
        configuration.Configure(container, "defaultContainer");
        //通过Resolve<IA>方法返回的是一个类型为A的对象,该对象的三个属性被进行了有效的初始化。
        //这个简单的程序分别体现了接口注入(通过相应的接口根据配置解析出相应的实现类型)、构造器注入(属性B)、属性注入(属性C)和方法注入(属性D)
        A a = container.Resolve<IA>() as A;
        if (null != a)
        {
            Console.WriteLine("a.B==null?{0}", a.B == null ? "Yes" : "No");
            Console.WriteLine("a.C==null?{0}", a.C == null ? "Yes" : "No");
            Console.WriteLine("a.D==null?{0}", a.D == null ? "Yes" : "No");
        }  

    }
}

public interface IA { }
public interface IB { }
public interface IC { }
public interface ID { }

public class A : IA
{
    //1、说明:构造器注入的参数不一定在类中要有对应的字段或属性存在
    public IB B { get; set; }
    //2、属性注入
    //属性C上应用了DependencyAttribute特性,
    //意味着这是一个需要以属性注入方式被初始化的依赖属性
    [Dependency]
    public IC C { get; set; }
    //3、方法注入
    //属性D则通过方法Initialize初始化,该方法上应用了特性InjectionMethodAttribute,
    //意味着这是一个注入方法在A对象被IoC容器创建的时候会被自动调用
    public ID D { get; set; }

    //1、构造器注入
    public A(IB b)
    {
        this.B = b;
    }
    [InjectionMethod]
    public void Initalize(ID d)
    {
        this.D = d;
    }
}
public class B : IB { }
public class C : IC { }
public class D : ID { }  

}
配置文件

<?xml version="1.0" encoding="utf-8"?>
结果:

a.B == null ? No
a.C == null ? No
a.D == null ? No

转载部分来源于:https://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html

猜你喜欢

转载自blog.csdn.net/carcarrot/article/details/118195494