• 运用Unity实现依赖注入[结合简单三层实例]


    一:理论部分

    依赖注入:这是 Ioc 模式的一种特殊情况,是一种基于改变对象的行为而不改变类的内部的接口编程技术。开发人员编写实现接口的类代码,并基于接口或者对象类型使用容器注入依赖 的对象实例到类中。用于注入对象实例的技术是接口注入、构造函数注入、属性(设置器)注入和方法调用注入。

    Unity是微软企业库一部分,是一个轻量级、可扩展的依赖注入容器,支持构造函数、属性和方法调用注入;

    针对依赖注入以前我也写过一篇结合三层的文章:spring.net 结合简单三层实例

    二:实例简介

    1:本实例将通过一个简单的三层演示使用Unity实现依赖注入,并把相应的具体实例写入在配置文件里,达到后期可能方便修改;首先看一下实例分层的情况:

    IAopDAL-数据接口层(类库) [AopDAL AopOracelDAL]-分别实现数据接口的数据层(类库)

    IAopBLL-逻辑接口层(类库) AopBLL-实现逻辑接口层(类库) 

    AopUnity-主程序层(控制台程序)

    Command-公共助手层(类库)

    2:其中Command我们简单编写一个实现Unity助手的类;首先要引用几个Unity的DLL文件;

    3:AopDAL、AopOracelDAL是两个实现不同功能的类库,在这我们就比喻成一个插入MSSQL数据库,另外一个就是插入Oracel数据库;

    其中AopBLL我们没有直接引用具体的AopDAL数据层,而是引用其对应接口层;主程序 AopUnity同样也没有具体的BLL层,也是引用其BLL接口层;

    把接口对应的具体层类写入到配置文件里,做到依赖注入,只要简单修改配置文件就可以达到修改调用;

    因为AopDAL、AopOracelDAL、AopBLL我们都没有直接引用,所以在生成DLL后是不会保存在主程序的bin里面,所以我们要修改这三个生成的路径;

    三:实例编码

    1:IAopDAL层我们只简单创建一个IReadData类代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace IAopDAL
    {
        public interface IReadData
        {
            string ReadDataStr(string Name);
        }
    }

    2:AopDAL实现接口层IAopDAL

    using IAopDAL;
    namespace AopDAL
    {
        public class ReadDataDAL:IReadData
        {
            public string ReadDataStr(string Name)
            {
                return string.Format("把{0}写入MSSQL数据库成功", Name);
            }
        }
    }

    3:AopOracelDAL同样实现IAopDAL层,其功能跟AopDAL一样

    using IAopDAL;
    namespace AopOracelDAL
    {
        public class ReadDataDAL:IReadData
        {
            public string ReadDataStr(string Name)
            {
                return string.Format("把{0}写入Oracel数据库成功", Name);
            }
        }
    }

    4:IAopBLL逻辑接口层的内容如下:

    namespace IAopBLL
    { 
        public interface IReadDataBLL
        {
            string ReadDataStr(string Name);
        }
    }

    5:AopBLL层实现IAopBLL接口层,要引用IAopDAL、IAopBLL、Command;

    其中IReadData bllServer = new UnityContainerHelp().GetServer<IReadData>();就是过过公共助手Command类库调用Unity来实现依赖注入,

    using IAopDAL;
    using IAopBLL;
    using Command;
    namespace AopBLL
    {
        public class ReadDataBLL:IReadDataBLL
        {
            IReadData bllServer = new UnityContainerHelp().GetServer<IReadData>();
            public string ReadDataStr(string Name)
            {
                return bllServer.ReadDataStr(Name);
            }
        }
    }

    6:Command公类助手代码如下,简单对Unity的封装,引用几个Unity的命名空间,我们把依赖注入的对象写入在主程序的.config文件里,这边就是通过读取配置文件来查看其对应哪个类库;

    using System.Text;
    using Microsoft.Practices.Unity;
    using Microsoft.Practices.Unity.Configuration;
    using Microsoft.Practices.Unity.InterceptionExtension;
    using Microsoft.Practices.Unity.InterceptionExtension.Configuration;
    using System.Configuration;
    
    namespace Command
    {
        public class UnityContainerHelp
        {
            private IUnityContainer container;
            public UnityContainerHelp()
            {
                container = new UnityContainer();
                UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
                container.LoadConfiguration(section, "FirstClass");
            }
    
            public T GetServer<T>()
            {
                return container.Resolve<T>();
            }
    
            public T GetServer<T>(string Name)
            {
                return container.Resolve<T>(Name);
            }
        }
    }

    7:主程序代码:同样只是简单的引用Command、IAopBLL两层;

    using Command;
    using IAopBLL;
    namespace AopUnity
    {
        class Program
        {
            static void Main(string[] args)
            {
                IReadDataBLL bllServer = new UnityContainerHelp().GetServer<IReadDataBLL>();
                Console.WriteLine(bllServer.ReadDataStr("踏浪帅"));
            }
        }
    }

    我们新建一个App.config文件(因为我主程序是控制台,若是WEB程序可以把它放在web.config里面);其中register 就是我们注入的节点,type为接口层,mapTo则是我们对应的具体实现层,这边也是我们修改配置的地方;

    <configuration>
      <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
      </configSections>
      <unity xmlns="http://schemas.microsoft.com/practces/2010/unity">
        <container name="FirstClass">
          <register type="IAopBLL.IReadDataBLL,IAopBLL" mapTo="AopBLL.ReadDataBLL,AopBLL">
          </register>
          <register type="IAopDAL.IReadData,IAopDAL" mapTo="AopOracelDAL.ReadDataDAL,AopOracelDAL"/>
        </container>
      </unity>
    <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>


    四:运行效果

    1:当配置文件里为:

    <register type="IAopDAL.IReadData,IAopDAL" mapTo="AopOracelDAL.ReadDataDAL,AopOracelDAL"/>

    2:修改配置文件内容:

    我们只是简单的修改配置就达到我们想要的效果,消除对具体实现层的引用;

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。  因为,我的写作热情也离不开您的肯定支持。
     
    感谢您的阅读(因为源代码现在我正接着写Unity实现AOP的功能,所以将在实现功能后一起贴出)

  • 相关阅读:
    我是服务的执政官-服务发现和注册工具consul简介
    跳闸了啊! 服务容灾:熔断器简介
    论获取缓存值的正确姿势
    容器化redis高可用方案
    ASP.NET SessionState 解惑
    Thymeleaf 模板的使用
    记录js的一个图片预览功能代码
    记录一个简单的可以拖动的弹出层
    oracle安装报错[INS-30131]执行安装程序验证所需的初始设置失败(无法访问临时位置)解决方法!
    nginx学习笔记2
  • 原文地址:https://www.cnblogs.com/wujy/p/3317795.html
Copyright © 2020-2023  润新知