Unity 依赖注入知识点
三种依赖注入方法,构造器注入、属性注入、方法注入
可以配置Config文件,来实现不用修改代码。需要先将接口与实体关联,然后使用时会自动加载对应实体。
namespace WeChatConsole
{
internal class Program
{
private static void Main(string[] args)
{
#region 构造器注入,需要在构造函数中传递抽象参数 UnityContainer container = new UnityContainer();
container.RegisterType<IWaterTool, Press2Water>(); //依赖注入
//container.RegisterType<IWaterTool, Press2Water>(); //重复注入会替换
IPeople people = container.Resolve<VillagePeople>(); //返回
people.DrinkWater();
#endregion #region 属性注入
IPeople people2 = container.Resolve<Village2People>(); //返回
people2.DrinkWater();
#endregion #region 读取配置文件
UnityContainer container2 = new UnityContainer();
UnityConfigurationSection configuration = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection;
configuration.Configure(container2, "WeChatContatiner");
IPeople people3 = container2.Resolve<Village2People>(); //返回
people3.DrinkWater();
#endregion Console.Read();
}
}
//人
interface IPeople
{
void DrinkWater();
}
//村民
class VillagePeople : IPeople
{
IWaterTool _pw;
public VillagePeople(IWaterTool pw)
{
_pw = pw;
}
public void DrinkWater()
{
Console.WriteLine(_pw.returnWater());
}
}
class Village2People : IPeople
{
[Dependency] //属性注入模式
public IWaterTool _pw { get; set; } [InjectionMethod] //方法注入模式
public void DrinkWater()
{
Console.WriteLine(_pw.returnWater() + " 第二版");
}
}
//水
interface IWaterTool
{
string returnWater();
}
//压水井
class PressWater : IWaterTool
{
public string returnWater()
{
return "压水井执行方法";
}
}
class Press2Water : IWaterTool
{
public string returnWater()
{
return "压水井2执行方法";
}
}
}
配置文件如下:
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
<unity>
<container name="WeChatContatiner">
<register type="WeChatConsole.IWaterTool,WeChatConsole" mapTo="WeChatConsole.Press2Water,WeChatConsole" />
</container>
</unity>
在看一个例子
public static class Program
{
public static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
UnityConfigurationSection configuration = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection;
configuration.Configure(container, "defaultContainer");
A a = container.Resolve<IA>() as A;
if (a != null)
{
Console.WriteLine("a.B=" + a.B == null ? "Y" : "N");
Console.WriteLine("a.C=" + a.C == null ? "Y" : "N");
Console.WriteLine("a.D=" + a.D == null ? "Y" : "N");
}
Console.ReadKey();
}
} public interface IA { }
public interface IB { }
public interface IC { }
public interface ID { }
public class A : IA
{
public IB B { get; set; } [Dependency]
public IC C { get; set; } public ID D { get; set; } public A(IB b)
{
this.B = b;
} [InjectionMethod]
public void Initialize(ID d)
{
this.D = d;
}
}
public class B : IB { };
public class C : IC { };
public class D : ID { };
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Microsoft.Practices.Unity.Configuration" />
</configSections>
<unity>
<containers>
<container name="defaultContainer">
<register type="ConsoleApplication1.IA,ConsoleApplication1" mapTo="ConsoleApplication1.A,ConsoleApplication1" />
<register type="ConsoleApplication1.IB,ConsoleApplication1" mapTo="ConsoleApplication1.B,ConsoleApplication1" />
<register type="ConsoleApplication1.IC,ConsoleApplication1" mapTo="ConsoleApplication1.C,ConsoleApplication1" />
<register type="ConsoleApplication1.ID,ConsoleApplication1" mapTo="ConsoleApplication1.D,ConsoleApplication1" />
</container>
</containers>
</unity>
</configuration>
MVC
在MVC框架下使用Unity,需要在引入Unity.MVC 这个Nuget包
然后在Global.asax.cs 中,注入依赖
UnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType<IEmployeeRepository, EmployeeRepository>();
DependencyResolver.SetResolver(new UnityDependencyResolver(unityContainer));
此时,在控制器中,就可以使用构造器注入、属性注入、方法注入了
BuildUp
可以给对象进行注入显示注入,调用此方法,我们的对象就包含注入的方法了。
IUnityContainer container = new UnityContainer();
UnityConfigurationSection configuration = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection;
configuration.Configure(container, "defaultContainer");
Program pro = new Program();
container.BuildUp(pro);
pro.HttpClient();
protected void Application_PreRequestHandlerExecute(object sender,EventArgs e)
{
Page handler = HttpContext.Current.Handler as Page;
if(handler != null){
IUnityContainer container = 实体;
if(container != null){
container.BuildUp(handler.GetType(),handler);
}
}
}
Unity 依赖注入知识点的更多相关文章
- Unity 依赖注入之二
1. 构造子注入 1.1 构造子注入初级代码 container.RegisterType<IMyWork, MyWork>(new InjectionConstructor(new Bo ...
- Unity依赖注入使用详解
写在前面 构造器注入 Dependency属性注入 InjectionMethod方法注入 非泛型注入 标识键 ContainerControlledLifetimeManager单例 Unity注册 ...
- WPF PRISM开发入门二(Unity依赖注入容器使用)
这篇博客将通过一个控制台程序简单了解下PRISM下Unity依赖注入容器的使用.我已经创建了一个例子,通过一个控制台程序进行加减乘除运算,项目当中将输入输出等都用接口封装后,结构如下: 当前代码可以点 ...
- C# Unity依赖注入
简介: 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的手中,在这个过程中你不是一个控制者而是一个请求者,依赖于容器提供给你的资源,控制权落到了容器 ...
- Unity 依赖注入
关于Ioc的框架有很多,比如astle Windsor.Unity.Spring.NET.StructureMap,我们这边使用微软提供的Unity做示例,你可以使用Nuget添加Unity,也可以引 ...
- c# Unity依赖注入WebService
1.IOC与DI简介 IOC全称是Inversion Of Control(控制反转),不是一种技术,只是一种思想,一个重要的面相对象编程的法则,它能知道我们如何设计出松耦合,更优良的程序.传统应用程 ...
- 使用Microsoft.Practices.Unity 依赖注入
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
- 使用Microsoft.Practices.Unity 依赖注入 转载https://www.cnblogs.com/slardar1978/p/4205394.html
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入
系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 本节重构一下代码,采用IOC控制反转,也就是依赖注入 您可以访问http://unity.codeplex.com/rel ...
随机推荐
- Java调用C/C++编写的第三方dll动态链接库(zz)
这里主要用的方法是JNI.在网上查资料时看到很多人说用JNI非常的复杂,不仅要看很多的文档,而且要非常熟悉C/C++编程.恐怕有很多人在看到诸如此类的评论时已经决定绕道用其他方法了.本文将做详细的介绍 ...
- Expression Blend4经验分享:文字公告无缝循环滚动效果
这次分享一个类似新闻公告板的无缝循环滚动效果,相信很多项目都会应用到这个效果.之前我也百度了一下,网上的一些Silverlight的文字或图片滚动效果,都是一次性滚动的,如果要做到无缝循环滚动,多数要 ...
- RHEL每天定时备份Oracle
步骤: (1)创建脚本文件bak_112.sh,内容如下(自动按当前日期备份数据库): #!/bin/sh export ORACLE_BASE=/u01/app/oracle; ORACLE_HOM ...
- SDRAM读写一字(下)
SDRAM读写一字 SDRAM控制模块 上电后进行初始化状态,初始化完成后进入空闲状态,在此进行判断如下判断: 如果自刷新时间到,则进行自刷新操作,操作完成后重新进入空闲状态: 如果读使能有效则进行读 ...
- 使用ContentProvider进行应用程序间的数据交互
什么是ContentProvider: ContentProvider用来管理数据的访问规则.它允许你的应用程序向外界暴露需要被访问的数据. 是Android的四大组件之一. ContentProvi ...
- 转 为什么文件存储要选用B+树这样的数据结构?
为什么文件存储要选用B+树这样的数据结构? "文件存储要选用B+树这样的数据结构"--没记错的话,这是严蔚敏那本数据结构书上的一句结论.不知道是我没细看还是她没细讲,反正当时纯粹应 ...
- Ceph性能优化总结(v0.94)
优化方法论 做任何事情还是要有个方法论的,“授人以鱼不如授人以渔”的道理吧,方法通了,所有的问题就有了解决的途径.通过对公开资料的分析进行总结,对分布式存储系统的优化离不开以下几点: 1. 硬件层面 ...
- 延时程序执行Qt
有时候为了让程序暂停一下,不让它一直跑下去,可以使它进入循环结构中! 例如: #include <QCoreApplication> #include <qdebug.h> # ...
- ActiveMQ_安全配置(五)
如果Activemq不加安全配置,那么任何知道队列所在服务器IP的人都可以发送接收队列消息 安全配置主要是通过配置账号密码增强安全性 参考资料:http://activemq.apache.org/s ...
- 如何在CentOS 5/6上安装EPEL源
EPEL 是什么? EPEL (Extra Packages for Enterprise Linux,企业版Linux的额外软件包) 是Fedora小组维护的一个软件仓库项目,为RHEL/CentO ...