运用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的功能,所以将在实现功能后一起贴出)

时间: 2025-01-01 04:57:20

运用Unity实现依赖注入[结合简单三层实例]的相关文章

运用Unity实现依赖注入[有参构造注入]

上一篇章讲到关于使用Unity实现依赖注入的简单功能,针对有博友提出关于有参构造注入的问题; 本文同样通过一个实例来讲解如何实现此功能,文中一些分层讲解可以看上一文章(运用Unity实现依赖注入[结合简单三层实例]),本文就不在重复; 1:首先我们在IAopBLL层新建一个IPropertyBLL类,我们增加的两个属性:name跟age namespace IAopBLL { public interface IPropertyBLL { string name { set; get; } in

Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)

在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建了一个简单的基于泛型的仓储模式的框架,例子也呈现了一个实体框架应用的雏形,本篇继续介绍这个主题,继续深化介绍Entity Framework 实体框架的知识,以及持续优化这个仓储模式的实体框架,主要介绍业务逻辑层的构建,以及利用Unity和反射进行动态的对象注册. 1.EDMX文件位置的调整 我们从上篇例子,

Unity 之依赖注入

什么是Unity? Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题.构建一个成功应用程序的关键是实现非常松散的耦合设计.松散耦合的应用程序更灵活,更易于维护.这样的程序也更容易在开发期间进行测试.你可以模拟对象,具有较强的具体依赖关系的垫片(轻量级模拟实现),如数据库连接,网络连接,ERP连接,和丰富的用户界面组件.例如,处理客户信息的对象可能依赖于其他对象访问的数据存储,验证信息,并检查该用户是

【ASP.Net MVC3 】使用Unity 实现依赖注入

什么是Unity? Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题.构建一个成功应用程序的关键是实现非常松散的耦合设计.松散耦合的应用程序更灵活,更易于维护.这样的程序也更容易在开发期间进行测试.你可以模拟对象,具有较强的具体依赖关系的垫片(轻量级模拟实现),如数据库连接,网络连接,ERP连接,和丰富的用户界面组件.例如,处理客户信息的对象可能依赖于其他对象访问的数据存储,验证信息,并检查该用户是

在ASP.NET MVC中使用Unity进行依赖注入的三种方式

在ASP.NET MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请求的 Controller,让Controller依赖于ModelRepository的抽象而不是它的实现. 我们可以在三个阶段使用IoC实现上面所说的解耦操作,首先需要简单介绍一下默认情况下Controller的激活过程: 1.用户发送请求黑ASP.NET,路由系统对请求进行解析,根据注册的路由规则对请求进行匹配,解析出Controller和Ac

Unity轻量级依赖注入容器

一.前言 Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.在Nuget里安装unity 二.Unity的API方法 UnityContainer.RegisterType<ITFrom,TTO>();  //注册映射 UnityContainer.RegisterType< ITFrom, TTO >("keyName");//注册映射指定key值 IEnumerable<T> databases = UnityCon

再谈依赖注入(依赖注入的简单实现)

之前说过,依赖注入就是为了解决依赖的问题的,在Spring中,本来应该自己入new的对象自己不来new了,交给bean去new.其实使用反射可以实现依赖注入. 下面就是简单实现的方式: 使用反射可以new出新的实例,我们可以这么做: 1 public Object getInstance(String ClassName){ 2 private Object result=null; 3 try { 4 result=Class.forName(ClassName).newInstance();

在 mvc 4 中使用 unity 进行依赖注入

关于依赖注入的概念,这里就不再叙述了,我们用 mvc 4 结合 unity,使用构造函数来进行依 赖注入.具体步骤如下: 1. 首先建立 一个 mvc 项目, 选择 basic 创建好后,完整的项目应该是这样的: 2. 创建 Home控制器, 并添加 index 视图 3.创建 UserInfo 类, 和 Iuser 接口以及 UserService类,UserService 实现Iuser 接口中 的方法, 其中的业务逻辑自己可以根据具体的情况来实现 4.打开 Nuget 程序管理包, 在搜索

spring依赖注入的简单解释

spring的依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new出指定实例并且将实例注入到需要该对象的类中. (而通常,我们想要依赖其它类的时候,我们先new出它,然后调用该实例的方法) 依赖注入又叫“控制反转”,意思就是说new出来的实例权不再是程序员,而是交给spring容器来控制