你必须要知道的架构知识~第五章 依赖住入在这个时候出场了

简介:

这段时间确实忙,以至于连写博客的时间都没有了,今天正好有点时间,有第五章依赖住入简单的说一下,主要分两块,一是依赖住入的概念,什么时候使用依赖注入,第二个问题是通过一个使用Unity的实例来让大家对依赖注入有一个很直观的认识。

一 概念:依赖注入,即Dependency Injection,即DI,有时也叫它控制反转,一般用IoC来实现对象的创建工作,我们知道一个类,要想被实例化我们可以用new关键字,例如一个数据操作接口规范interface IRepository{},其中有一个SQLSERVER的数据操作去实现了它class  SQLRepository:IRepository{},而客户电脑上装的是oracle,所以没办法,我又为oracle实现了一个数据操作,即class ORACLERepository:IRepository{},如果我们希望创建一个SQLRepository实例,我们可以有至少两种方法,即:

SQLRepository sqlRepository=new SQLRepository();

IRepository  iRepository =new SQLRepository();

从上面两种创建对象的方法可以知道第二次更面向对象,因为iRepository 不仅可以生成SQLRepository对象,它还可以生成所有继承自IRepository  的对象,但如果我们希望在程序运行中,或者在今天很方便的是实现SQLRepository与ORACLERepository之间的切换,那需要对程序进行很大的手术,这事实上就是类的高耦合,为了解决上面的问题,我们引入了一种在程序”运行时”动态改变对象创建方式的技术,这种技术我们成为“控制反转”,也就是依赖注入,目前比较流行的IoC容器有Unity,Pico Containe,JBos等,我们以Unity为例来学习一下依赖注入在项目中的应用。

二 依赖注入在项目中的应用

image

我们看到,这就是一个依赖注入的项目,它一般在项目中是对所有层可见的,在这个项目中,我们的Service(BLL)层通过Ioc容器实现了对Data(DAL)层的控制反转,它将需要实现IoC的类放在配置文件中,这样在程序运行时可以动态的随时调整。

image

我们看到,它会在配置文件中找到repositoryContainer这个节点,然后把它的值取出并反射成我们的对象,下面是配置文件中的代码片断

  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.1.0.0,Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    <section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </configSections>
  <unity>
    <containers>
      <container name="repositoryContainer">
        <types>
          <type type="TESTWEB.Controllers.IPeople,TESTWEB" mapTo="TESTWEB.Controllers.PeopleChina,TESTWEB"></type>
        </types>
      </container>
    </containers>
  </unity>
以下是实现Unity依赖注入的DLL
image 

事实上,依赖注入并不神秘,只要我们知道什么时候用它,这是最重要的。

下面分享一个创建unity容器的代码片断

/// <summary>
       /// Initializes container.
       /// </summary>
       public override void Initialize()
       {
           OnBeforeInitialized(new ContainerEventArgs(this, ContainerType.Unity));

           if (CurrentContext.Application[Name] == null)
           {
               lock (_synlock)
               {
                   if (CurrentContext.Application[Name] == null)
                   {
                       IUnityContainer currentContainer = new UnityContainer();
                       UnityConfigurationSection section = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
                       section.Containers[Name].Configure(currentContainer);
                       CurrentContext.Application[Name] = currentContainer;
                   }
               }
           }

           OnAfterInitialized(new ContainerEventArgs(this, ContainerType.Unity));
       }

       /// <summary>
       /// Resolves this instance.
       /// </summary>
       /// <returns></returns>
       public override T Resolve<T>()
       {
           try
           {
               Initialize();

               IUnityContainer currentContainer = CurrentContext.Application[Name] as IUnityContainer;
               return currentContainer.Resolve<T>();
           }
           catch (Exception ex)
           {
               OnResolveFailed(new ContainerFailedEventArgs(this, ContainerType.Unity, ex));
               return default(T);
           }
       }

在Initialize()方法中使用了C#的事件,在设置容器名称之前与之前各触发了一个事件,这样当有其它地方对这两个事件订阅时,会在初始化容器时,被同时触发。呵呵。够巧妙吧!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:你必须要知道的架构知识~第五章 依赖住入在这个时候出场了,如需转载请自行联系原博主。

目录
相关文章
|
供应链 架构师 数据库
架构师带你搞明白微服务进阶场景实战:服务之间的数据依赖问题
数据同步 上面讲解了数据一致性的解决方案,这一篇来讲讲服务之间的数据依赖问题,还是先来说说具体的业务场景。 业务场景:如何解决微服务之间的数据依赖问题 在某个供应链系统中,存在商品、订单、采购这3个服务,它们的主数据部分结构表如下。
架构师带你搞明白微服务进阶场景实战:服务之间的数据依赖问题
|
24天前
|
缓存 前端开发 JavaScript
前端架构思考:代码复用带来的隐形耦合,可能让大模型造轮子是更好的选择-从 CDN 依赖包被删导致个站打不开到数年前因11 行代码导致上千项目崩溃谈谈npm黑洞 - 统计下你的项目有多少个依赖吧!
最近,我的个人网站因免费CDN上的Vue.js包路径变更导致无法访问,引发了我对前端依赖管理的深刻反思。文章探讨了NPM依赖陷阱、开源库所有权与维护压力、NPM生态问题,并提出减少不必要的依赖、重视模块设计等建议,以提升前端项目的稳定性和可控性。通过“left_pad”事件及个人经历,强调了依赖管理的重要性和让大模型代替人造轮子的潜在收益
|
5月前
|
存储 供应链 安全
区块链技术防止交易被篡改的能力主要依赖于其独特的架构和机制
**区块链技术通过分布式存储、去中心化网络、哈希链接、共识机制及加密算法确保交易防篡改。每个区块含前块哈希,篡改将破坏链式结构;共识机制如PoW、PoS保证交易验证;智能合约增强安全性。多层防护保障数据完整性和安全性,支撑其在多个行业中的应用。**
|
6月前
|
消息中间件 前端开发 测试技术
DDD - 分层架构:有效降低层与层之间的依赖
DDD - 分层架构:有效降低层与层之间的依赖
342 0
|
6月前
|
C#
C# 三层级架构问题之 能加载文件或程序集或它的某一个依赖项。系统找不到指定的文件
C# 三层级架构问题之 能加载文件或程序集或它的某一个依赖项。系统找不到指定的文件
83 0
《软件架构之道》c#实现依赖反转
《软件架构之道》c#实现依赖反转
|
开发框架 Java Spring
低依赖架构思想
天上飞的理念,必有落地的实现! 软件系统中一个类中用到了另一个类就产生了依赖,依赖是不可避免的。但我们尽量要降低依赖,以达到高类聚、低耦合的系统架构。低依赖软件系统架构的思想为——依赖倒置,具体可解读为两点: 1.上层模块尽量不要依赖于具体的下层模块,而是应该尽量让它们共同依赖于一个抽象。 2.抽象尽量不要依赖于具体对象,而是应该具体对象依赖于抽象。
96 0
|
Java Maven
架构:第二章:单一(伪分布式)架构之使用Maven建立各个工程之间的依赖、继承、聚合关系
架构:第二章:单一(伪分布式)架构之使用Maven建立各个工程之间的依赖、继承、聚合关系
架构:第二章:单一(伪分布式)架构之使用Maven建立各个工程之间的依赖、继承、聚合关系
|
SQL 消息中间件 Prometheus
spring cloud 二代架构依赖组件 docker全配置放送
Spring Cloud Alibaba 主要包含 Sentinel、Nacos、RocketMQ、Dubbo、Seata 等组件。 二代引入了 Spring Cloud Alibaba
spring cloud 二代架构依赖组件 docker全配置放送
|
计算机视觉
【错误记录】NDK 报错 java.lang.UnsatisfiedLinkError 的一种处理方案 ( 主应用与依赖库 Module 的 CPU 架构配置不匹配导致 )(二)
【错误记录】NDK 报错 java.lang.UnsatisfiedLinkError 的一种处理方案 ( 主应用与依赖库 Module 的 CPU 架构配置不匹配导致 )(二)
185 0
【错误记录】NDK 报错 java.lang.UnsatisfiedLinkError 的一种处理方案 ( 主应用与依赖库 Module 的 CPU 架构配置不匹配导致 )(二)