.NET 使用unity实现依赖注入

前端之家收集整理的这篇文章主要介绍了.NET 使用unity实现依赖注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原文地址:http://www.cnblogs.com/wujy/p/3317795.html

一:理论部分

依赖注入:这是 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 { class ReadDataDAL:IReadData { string Name) { return string.Format("把{0}写入MSsql数据库成功",Name); } } }
3:AopOracelDAL同样实现IAopDAL层,其功能跟AopDAL一样

namespace AopOracelDAL { 把{0}写入Oracel数据库成功 4:IAopBLL逻辑接口层的内容如下:

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

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

using IAopBLL; using Command; namespace AopBLL { class ReadDataBLL:IReadDataBLL { IReadData bllServer = new UnityContainerHelp().GetServer<IReadData>(); 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 { 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>(return container.Resolve<T>(Name); } } }
7:主程序代码:同样只是简单的引用Command、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=" type=Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity xmlns=http://schemas.microsoft.com/practces/2010/unity">
    <container name=">
      <register type=IAopBLL.IReadDataBLL,IAopBLL" mapTo=AopBLL.ReadDataBLL,AopBLL">
      </register>
      <register type=IAopDAL.IReadData,IAopDALAopOracelDAL.ReadDataDAL,AopOracelDAL"/>
    </container>
  </unity>
<startup><supportedRuntime version=v4.0" sku=.NETFramework,Version=v4.0"/></startup></configuration>

四:运行
效果

1:当配置文件里为:

<register type="/>

2:修改配置文件内容

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

原文链接:https://www.f2er.com/javaschema/285504.html

猜你在找的设计模式相关文章