别人做的网站自己根目录吗,3d设计软件有哪些软件,重庆专业做网站的公司,南京工程网站建设IOC:英文全称#xff1a;Inversion of Control#xff0c;中文名称#xff1a;控制反转#xff0c;它还有个名字叫依赖注入#xff08;Dependency Injection#xff09;。
作用#xff1a;将各层的对象以松耦合的方式组织在一起#xff0c;解耦#xff0c;各层对象的调… IOC:英文全称Inversion of Control中文名称控制反转它还有个名字叫依赖注入Dependency Injection。
作用将各层的对象以松耦合的方式组织在一起解耦各层对象的调用完全面向接口。当系统重构的时候代码的改写量将大大减少。
理解依赖注入当一个类的实例需要另一个类的实例协助时在传统的程序设计过程中通常有调用者来创建被调用者的实例。然而采用依赖注入的方式创建被调用者的工作不再由调用者来完成因此叫控制反转创建被调用者的实例的工作由IOC容器来完成然后注入调用者因此也称为依赖注入。
举个有意思的例子来源于互联网假如我们要设计一个Girl和一个Boy类其中Girl有Kiss方法即Girl想要Kiss一个Boy首先问题是Girl如何认识Boy在我们中国常见的MM认识GG的方式有以下几种A 青梅竹马 B 亲友介绍 C 父母包办哪一种是最好的
1.青梅竹马很久很久以前有个有钱的地主家的一闺女叫Lily她老爸把她许配给县太爷的儿子Jimmy属于指腹为婚Lily非常喜欢kiss,但是只能kiss Jimmypublic class Lily{ public Jimmy jimmy; public Girl() { jimmynew Jimmy(); } public void Kiss() { jimmy.Kiss(); } } public class Jimmy { public void Kiss() { Console.WriteLine(kissing); } }
这样导致Lily对Jimmy的依赖性非常强紧耦合。2.亲友介绍经常Kiss同一个人令Lily有些厌恶了她想尝试新人于是与Jimmy分手了通过亲朋好友中间人来介绍public class Lily{ public Boy boy; public Girl() { boyBoyFactory.createBoy(); } public void Kiss() { boy.Kiss(); } } 亲友介绍固然是好。如果不满意尽管另外换一个好了。但是亲友BoyFactory经常是以Singleton的形式出现不然就是存在于Globals无处不在无处不能。实在是太繁琐了一点不够灵活。我为什么一定要这个亲友掺和进来呢为什么一定要付给她介绍费呢万一最好的朋友爱上了我的男朋友呢3.父母包办一切交给父母自己不用非吹灰之力Lily在家只Kisspublic class Lily{ public Boy boy; public Girl(Boy boy) { this.boyboy; } public void Kiss() { this.boy.Kiss(); } } Well这是对Girl最好的方法只要想办法贿赂了Girl的父母并把Boy交给他。那么我们就可以轻松的和Girl来Kiss了。看来几千年传统的父母之命还真是有用哦。至少Boy和Girl不用自己瞎忙乎了。这就是IOC将对象的创建和获取提取到外部。由外部容器提供需要的组件。在设计模式中我们应该还知道依赖倒转原则应是面向接口编程而不是面向功能实现好处是多实现可以任意切换我们的Boy应该是实现Kissable接口。这样一旦Girl不想kiss可恶的Boy的话还可以kiss可爱的kitten和慈祥的grandmother好在.net中微软有一个轻量级的IoC框架Unity支持构造器注入属性注入方法注入如下图所示具体使用方法如下图所示using System; using Microsoft.Practices.Unity; namespace ConsoleApplication9
{ class Program { static void Main(string[] args) { //创建容器 IUnityContainer containernew UnityContainer(); //注册映射 container.RegisterTypeIKiss, Boy(); //得到Boy的实例 var boy container.ResolveIKiss(); Lily lily new Lily(boy); lily.kiss(); } } public interface IKiss { void kiss(); } public class Lily:IKiss { public IKiss boy; public Lily(IKiss boy) { this.boyboy; } public void kiss() { boy.kiss(); Console.WriteLine(lily kissing); } } public class Boy : IKiss { public void kiss() { Console.WriteLine(boy kissing); } }
}
如果采用配置文件注册的话?xml version1.0 encodingutf-8 ?
configuration configSections section nameunity typeMicrosoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration/ /configSections unity containers container namedefaultContainer register type命名空间.接口类型1,命名空间 mapTo命名空间.实现类型1,命名空间 / register type命名空间.接口类型2,命名空间 mapTo命名空间.实现类型2,命名空间 / /container /containers /unity
/configuration 配置的后台代码UnityConfigurationSection configuration ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection;
configuration.Configure(container, defaultContainer);
可以通过方法ResolveAll来得到所有注册对象的实例
var Instances container.ResolveIKiss();Martin Fowler在那篇著名的文章《Inversion of Control Containers and the Dependency Injection pattern》中将具体依赖注入划分为三种形式即构造器注入、属性设置注入和接口注入,习惯将其划分为一种类型匹配和三种注入类型匹配Type Matching虽然我们通过接口或者抽象类来进行服务调用但是服务本身还是实现在某个具体的服务类型中这就需要某个类型注册机制来解决服务接口和服务类型之间的匹配关系
构造器注入Constructor InjectionIoC容器会智能地选择选择和调用适合的构造函数以创建依赖的对象。如果被选择的构造函数具有相应的参数IoC容器在调用构造函数之前解析注册的依赖关系并自行获得相应参数对象
属性注入Property Injection如果需要使用到被依赖对象的某个属性在被依赖对象被创建之后IoC容器会自动初始化该属性
方法注入Method Injection如果被依赖对象需要调用某个方法进行相应的初始化在该对象创建之后IoC容器会自动调用该方法。我们创建一个控制台程序定义如下几个接口IA、IB、IC和ID和它们各自的实现类A、B、C、D。在类型A中定义了3个属性B、C和D其类型分别为接口IB、IC和ID。其中属性B在构在函数中被初始化以为着它会以构造器注入的方式被初始化属性C上应用了DependencyAttribute特性意味着这是一个需要以属性注入方式被初始化的依赖属性属性D则通过方法Initialize初始化该方法上应用了特性InjectionMethodAttribute意味着这是一个注入方法在A对象被IoC容器创建的时候会被自动调用。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 Initalize(ID d) { this.D d; } } public class B : IB { } public class C : IC { } public class D : ID { } 然后我们为该应用添加一个配置文件并定义如下一段关于Unity的配置。这段配置定义了一个名称为defaultContainer的Unity容器并在其中完成了上面定义的接口和对应实现类之间映射的类型匹配。?xml version1.0 encodingutf-8 ?
configuration configSections section nameunity typeMicrosoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration/ /configSections unity containers container namedefaultContainer register typeUnityDemo.IA,UnityDemo mapToUnityDemo.A, UnityDemo/ register typeUnityDemo.IB,UnityDemo mapToUnityDemo.B, UnityDemo/ register typeUnityDemo.IC,UnityDemo mapToUnityDemo.C, UnityDemo/ register typeUnityDemo.ID,UnityDemo mapToUnityDemo.D, UnityDemo/ /container /containers /unity
/configuration 最后在Main方法中创建一个代表IoC容器的UnityContainer对象并加载配置信息对其进行初始化。然后调用它的泛型的Resolve方法创建一个实现了泛型接口IA的对象。最后将返回对象转变成类型A并检验其B、C和D属性是否是空class Program { static void Main(string[] args) { UnityContainer container new UnityContainer(); UnityConfigurationSection configuration ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection; configuration.Configure(container, defaultContainer); A a container.ResolveIA() as A; if (null!a) { Console.WriteLine(a.Bnull?{0},a.Bnull?Yes:No); Console.WriteLine(a.Cnull?{0}, a.C null ? Yes : No); Console.WriteLine(a.Dnull?{0}, a.D null ? Yes : No); } } } 从如下给出的执行结果我们可以得到这样的结论通过ResolveIA方法返回的是一个类型为A的对象该对象的三个属性被进行了有效的初始化。这个简单的程序分别体现了接口注入通过相应的接口根据配置解析出相应的实现类型、构造器注入属性B、属性注入属性C和方法注入属性Da.B null ? Noa.C null ? Noa.D null ? No http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html IOC:英文全称Inversion of Control中文名称控制反转它还有个名字叫依赖注入Dependency Injection。作用将各层的对象以松耦合的方式组织在一起解耦各层对象的调用完全面向接口。当系统重构的时候代码的改写量将大大减少。理解依赖注入 当一个类的实例需要另一个类的实例协助时在传统的程序设计过程中通常有调用者来创建被调用者的实例。然而采用依赖注入的方式创建被调用者的工作不再由调用者来完成因此叫控制反转创建被调用者的实例的工作由IOC容器来完成然后注入调用者因此也称为依赖注入。举个有意思的例子来源于互联网 假如我们要设计一个Girl和一个Boy类其中Girl有Kiss方法即Girl想要Kiss一个Boy首先问题是Girl如何认识Boy 在我们中国常见的MM认识GG的方式有以下几种 A 青梅竹马 B 亲友介绍 C 父母包办 哪一种是最好的 1.青梅竹马很久很久以前有个有钱的地主家的一闺女叫Lily她老爸把她许配给县太爷的儿子Jimmy属于指腹为婚Lily非常喜欢kiss,但是只能kiss Jimmy public class Lily{ public Jimmy jimmy; public Girl() { jimmynew Jimmy(); } public void Kiss() { jimmy.Kiss(); } } public class Jimmy { public void Kiss() { Console.WriteLine(kissing); } } 这样导致Lily对Jimmy的依赖性非常强紧耦合。 2.亲友介绍经常Kiss同一个人令Lily有些厌恶了她想尝试新人于是与Jimmy分手了通过亲朋好友中间人来介绍 public class Lily{ public Boy boy; public Girl() { boyBoyFactory.createBoy(); } public void Kiss() { boy.Kiss(); } } 亲友介绍固然是好。如果不满意尽管另外换一个好了。但是亲友BoyFactory经常是以Singleton的形式出现不然就是存在于Globals无处不在无处不能。实在是太繁琐了一点不够灵活。我为什么一定要这个亲友掺和进来呢为什么一定要付给她介绍费呢万一最好的朋友爱上了我的男朋友呢 3.父母包办一切交给父母自己不用非吹灰之力Lily在家只Kiss public class Lily{ public Boy boy; public Girl(Boy boy) { this.boyboy; } public void Kiss() { this.boy.Kiss(); } } Well这是对Girl最好的方法只要想办法贿赂了Girl的父母并把Boy交给他。那么我们就可以轻松的和Girl来Kiss了。看来几千年传统的父母之命还真是有用哦。至少Boy和Girl不用自己瞎忙乎了。这就是IOC将对象的创建和获取提取到外部。由外部容器提供需要的组件。 在设计模式中我们应该还知道依赖倒转原则应是面向接口编程而不是面向功能实现好处是多实现可以任意切换我们的Boy应该是实现Kissable接口。这样一旦Girl不想kiss可恶的Boy的话还可以kiss可爱的kitten和慈祥的grandmother 好在.net中微软有一个轻量级的IoC框架Unity支持构造器注入属性注入方法注入如下图所示 具体使用方法如下图所示 using System; using Microsoft.Practices.Unity; namespace ConsoleApplication9 { class Program { static void Main(string[] args) { //创建容器 IUnityContainer containernew UnityContainer(); //注册映射 container.RegisterTypeIKiss, Boy(); //得到Boy的实例 var boy container.ResolveIKiss(); Lily lily new Lily(boy); lily.kiss(); } } public interface IKiss { void kiss(); } public class Lily:IKiss { public IKiss boy; public Lily(IKiss boy) { this.boyboy; } public void kiss() { boy.kiss(); Console.WriteLine(lily kissing); } } public class Boy : IKiss { public void kiss() { Console.WriteLine(boy kissing); } } } 如果采用配置文件注册的话 ?xml version1.0 encodingutf-8 ? configuration configSections section nameunity typeMicrosoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration/ /configSections unity containers container namedefaultContainer register type命名空间.接口类型1,命名空间 mapTo命名空间.实现类型1,命名空间 / register type命名空间.接口类型2,命名空间 mapTo命名空间.实现类型2,命名空间 / /container /containers /unity /configuration 配置的后台代码 UnityConfigurationSection configuration ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection; configuration.Configure(container, defaultContainer); 可以通过方法ResolveAll来得到所有注册对象的实例var Instances container.ResolveIKiss();Martin Fowler在那篇著名的文章《Inversion of Control Containers and the Dependency Injection pattern》中将具体依赖注入划分为三种形式即构造器注入、属性设置注入和接口注入,习惯将其划分为一种类型匹配和三种注入 类型匹配Type Matching虽然我们通过接口或者抽象类来进行服务调用但是服务本身还是实现在某个具体的服务类型中这就需要某个类型注册机制来解决服务接口和服务类型之间的匹配关系构造器注入Constructor InjectionIoC容器会智能地选择选择和调用适合的构造函数以创建依赖的对象。如果被选择的构造函数具有相应的参数IoC容器在调用构造函数之前解析注册的依赖关系并自行获得相应参数对象属性注入Property Injection如果需要使用到被依赖对象的某个属性在被依赖对象被创建之后IoC容器会自动初始化该属性方法注入Method Injection如果被依赖对象需要调用某个方法进行相应的初始化在该对象创建之后IoC容器会自动调用该方法。 我们创建一个控制台程序定义如下几个接口IA、IB、IC和ID和它们各自的实现类A、B、C、D。在类型A中定义了3个属性B、C和D其类型分别为接口IB、IC和ID。其中属性B在构在函数中被初始化以为着它会以构造器注入的方式被初始化属性C上应用了DependencyAttribute特性意味着这是一个需要以属性注入方式被初始化的依赖属性属性D则通过方法Initialize初始化该方法上应用了特性InjectionMethodAttribute意味着这是一个注入方法在A对象被IoC容器创建的时候会被自动调用。 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 Initalize(ID d) { this.D d; } } public class B : IB { } public class C : IC { } public class D : ID { } 然后我们为该应用添加一个配置文件并定义如下一段关于Unity的配置。这段配置定义了一个名称为defaultContainer的Unity容器并在其中完成了上面定义的接口和对应实现类之间映射的类型匹配。 ?xml version1.0 encodingutf-8 ? configuration configSections section nameunity typeMicrosoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration/ /configSections unity containers container namedefaultContainer register typeUnityDemo.IA,UnityDemo mapToUnityDemo.A, UnityDemo/ register typeUnityDemo.IB,UnityDemo mapToUnityDemo.B, UnityDemo/ register typeUnityDemo.IC,UnityDemo mapToUnityDemo.C, UnityDemo/ register typeUnityDemo.ID,UnityDemo mapToUnityDemo.D, UnityDemo/ /container /containers /unity /configuration 最后在Main方法中创建一个代表IoC容器的UnityContainer对象并加载配置信息对其进行初始化。然后调用它的泛型的Resolve方法创建一个实现了泛型接口IA的对象。最后将返回对象转变成类型A并检验其B、C和D属性是否是空 class Program { static void Main(string[] args) { UnityContainer container new UnityContainer(); UnityConfigurationSection configuration ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection; configuration.Configure(container, defaultContainer); A a container.ResolveIA() as A; if (null!a) { Console.WriteLine(a.Bnull?{0},a.Bnull?Yes:No); Console.WriteLine(a.Cnull?{0}, a.C null ? Yes : No); Console.WriteLine(a.Dnull?{0}, a.D null ? Yes : No); } } } 从如下给出的执行结果我们可以得到这样的结论通过ResolveIA方法返回的是一个类型为A的对象该对象的三个属性被进行了有效的初始化。这个简单的程序分别体现了接口注入通过相应的接口根据配置解析出相应的实现类型、构造器注入属性B、属性注入属性C和方法注入属性D a.B null ? No a.C null ? No a.D null ? No转载于:https://www.cnblogs.com/wangchuang/p/5650911.html