依赖注入基础知识
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〉
构造器注入的参数类型样式灵活多样
构造器注入的参数类型
- 可以是前面注册过的类型
- 可以是前面注册过的类型的IEnumerable类型
- 可以是得出前面注册过的类型委托类型,如Func〈Class1〉(前面可以是注册过Func〈Class1〉类型,也可以是注册过Class1类型)
- 可以是结合第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.youkuaiyun.com/litao2/article/details/80274734
框架 .NET Framework 4.5
dll文件:Microsoft.Practices.Unity.dll
Microsoft.Practices.Unity.Configuration.dll
dll下载地址:https://download.youkuaiyun.com/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 { }
}
配置文件
a.B == null ? No
a.C == null ? No
a.D == null ? No
转载部分来源于:https://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html