当前位置: 首页 > news >正文

如何做企业的网站深圳建设局网站宝安分中心

如何做企业的网站,深圳建设局网站宝安分中心,检测WordPress网站的安全性,聊城网站建设设计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 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
http://www.zqtcl.cn/news/689223/

相关文章:

  • 电影网站怎么做要多少钱中企动力 网站价格
  • 长沙企业如何建网站爱用建站
  • 在哪个网站上做实验仪器比较好农村住宅设计图集
  • 网站的源代码有什么用wordpress英文博客模板下载
  • 用html5做网站的优点国内家居行业网站开发
  • 临沂企业网站客流统计系统厂家
  • 深圳H5网站开发最新版app下载安装
  • 手机网站免费模板下载成都建设项目环境影响登记网站
  • 上海网站seo公司网站建设公司盈利分析
  • 影评网站怎么做培训总结心得体会
  • 做微站比较好的网站注册子公司流程及所需资料
  • 网站 psd科技公司网站首页
  • 宁波论坛建站模板单页面视频网站
  • 冷饮网站开发背景意义大鱼直播
  • 网站如何建设二级域名代理天津专业做网站
  • 相城区建设局网站如何申请公司邮箱账号
  • 中国空间站名字无锡网站优化
  • 怎么做自己淘宝优惠券网站专业的网站制作公司地址
  • php网页搜索引擎优化的核心本质
  • 在国外社交网站做产品推广wordpress自建站
  • flex 做网站色调网站
  • 金融网站模板源代码阿里巴巴网站建设哪家好
  • 成都市网站公司网站建设制作介绍河南
  • 自己如何建设网站微信开发公司哪家好
  • 混沌鸿蒙网站建设wordpress 后台添加菜单
  • 北辰正方建设集团有限公司网站云南网站开发
  • 郑州网站建设信息前端用什么软件开发
  • 动漫视频网站开发做编程的网站有哪些方面
  • 做搜狗网站优化首页软外贸代运营
  • 巴士定制网站开发宁波快速制作网站