DDD~Unity在DDD中的使用
上一讲介绍了DDD中的领域层,并提到下次要讲Unity,所以这篇文章当然就要介绍它了,呵呵,Unity是Microsoft.Practices中的一部分,主要实现了依赖注入的功能,或者叫它控制反转,对于控制反转(IoC)的文章我介绍了不少,Autofac,Castle等等,今天主要说一下Unity!
在我的DDD架构项目中,各层间实现IoC使用的是Unity,因为考虑到AOP,cache等功能,所以就直接用Microsoft.Practices组件了,它真的很强大!这次的项目在业务上采用WCF实现,所以WCF业务与基础设施之间会有通信,而基础设施只是去实现Domain定义的功能,所以这两个层之间也会有通信,最后就是Domain与WCF之间同样存在着接口的通信,如图:
aaarticlea/png;base64,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" alt="" />
Domain层定义一个接口,部分代码如下:
/// <summary>
/// 获取产品列表
/// </summary>
/// <returns></returns>
IQueryable<Product> GetProduct();
基础设施层实现它
public IQueryable<Product> GetProduct()
{
return this.GetModel();
}
它们之间的通信不存在IoC,因为如果你要使用其它的持久化方法,可以再建立一个项目,以别一种方式去实现持久化
WCF去声明一个Domain层的接口,实例化它的基础设施层的实例,这个过程需要解耦合,我们使用Unity来实现,它需要我们在config中去定义如何去实例化。
public class ProductServiceImpl : IProductService
{
private readonly IProductRepository _productRepository; /// <summary>
/// 构造方法注入
/// </summary>
/// <param name="productRepository"></param>
public ProductServiceImpl(IProductRepository productRepository)
{
if (productRepository == (IProductRepository)null)
throw new ArgumentException("context can't is null.");
_productRepository = productRepository;
} #region IProductService 成员
public ProductDTO GetProductByID(int id)
{
Mapper.CreateMap<Product, ProductDTO>();
return Mapper.Map<Product, ProductDTO>(_productRepository.Find(id));
}
}
上面使用unity中的构造方法注入,我们还可以使用服务调度器进行注入,看这种代码
public class ProductService : ServiceBase, IProductService
{ //通过ServiceLocator从IoC容器中获得对象
IProductService _productService = ServiceLocator.Instance.GetService<IProductService>();
#region IProductService 成员 public ProductDTO GetProductByID(int id)
{
return _productService.GetProductByID(id);
} }
下面是配置文件中需要注入的代码片断,包括缓存模块和日志模块
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<section name="cachingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>
<!--BEGIN: Unity-->
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" />
<container>
<extension type="Interception" />
<register type="Project.Caching.ICacheProvider, Project.Caching" mapTo="Project.Caching.EntLibCacheProvider, Project.Caching" />
<!--对数据上下文的注入-->
<register type="DDD_AOP_WCF.Domain.Products.IProductRepository, DDD_AOP_WCF.Domain" mapTo="DDD_AOP_WCF.Infrastructure.Repository.ProductRepository, DDD_AOP_WCF.Infrastructure" />
<!--对WCF的访问进行的注入与缓存和异常的拦截-->
<register type="DDD_AOP_WCF.ServiceContracts.IProductService, DDD_AOP_WCF.ServiceContracts" mapTo="DDD_AOP_WCF.Service.Implements.ProductServiceImpl, DDD_AOP_WCF.Service">
<!-- <interceptor type="VirtualMethodInterceptor" />-->
<interceptor type="InterfaceInterceptor" />
<interceptionBehavior type="Project.InterceptionBehaviors.CachingBehavior, Project.InterceptionBehaviors" />
<interceptionBehavior type="Project.InterceptionBehaviors.ExceptionLoggingBehavior, Project.InterceptionBehaviors" />
</register>
</container>
</unity>
<!--END: Unity-->
<!--BEGIN: Caching-->
<cachingConfiguration defaultCacheManager="ByteartRetailCacheManager">
<cacheManagers>
<add name="ByteartRetailCacheManager" type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" expirationPollFrequencyInSeconds="" maximumElementsInCacheBeforeScavenging="" numberToRemoveWhenScavenging="" backingStoreName="NullBackingStore" />
</cacheManagers>
<backingStores>
<add type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="NullBackingStore" />
</backingStores>
</cachingConfiguration>
<!--END: Caching-->
<!--BEGIN: log4net-->
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.log"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="100KB"/>
<staticLogFileName value="true"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%newline%date [%thread] %-5level %logger - %message%newline"/>
</layout>
</appender>
<logger name="ByteartRetail.Logger" >
<!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
<!--如果没有定义LEVEL的值,则缺省为DEBUG-->
<level value="INFO"/>
<appender-ref ref="RollingFileAppender"/>
</logger>
</log4net>
<!--END: log4net-->
好了,对于Unity在DDD中的使用就介绍到这里,如有不清楚的地方,可以直接给我留言或发email!
DDD~Unity在DDD中的使用的更多相关文章
- Unity制作游戏中的场景
Unity制作游戏中的场景 1.2.3 场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...
- Unity3D 将 Unity 嵌入WPF中的一些研究笔记
一. 在 WPF 中使用 WebBrowser,直接打开 WebPlayer.html 以这种方式有一个问题是. 无法在 WebBrowser 的上面 放置其它的控件, 在运行时,都不会显示 . 以 ...
- 【Unity游戏开发】浅谈Unity游戏开发中的单元测试
一.单元测试的定义与作用 单元测试定义:单元测试在传统软件开发中是非常重要的工具,它是指对软件中的最小可测试单元进行检查和验证,一般情况下就是对代码中的一个函数去进行验证,检查它的正确性.一个单元测试 ...
- Unity项目开发过程中常见的问题,你遇到过吗?
最近看到有朋友问一个unity游戏开发团队,需要掌握哪些知识之类的问题.事实上Unity引擎是一个很灵活的引擎,根据团队开发游戏类型的不同,对人员的要求也有差异,所以不能一概而论.但是,一些在Unit ...
- Unity 处理预设中的中文
Unity 处理预设中的中文 需求由来 项目接入越南版本 需要解决的文本问题 获取UI预设Label里面的中文(没被代码控制)提供给越南 Label里面的中文替换成越南文 解决流程 迭代获取Asset ...
- Unity 4.0 中的新动画系统——MecAnim
分享一个文档资料,关于动画系统的,版本应该很老了,但是有借鉴意义的: Unity 4.0 已于 2012 年 11 月 15 日正式发布,Unity 每一次版本的提升,都给游戏开发者带来惊喜,这一次也 ...
- [转] Draw Call未被批处理?告诉你在Unity 5.6中如何查找原因 [复制链接]
Unity在5.6之前的版本中并未提供很直接的方式来查找Draw Call未被批处理的原因,但Unity 5.6在Frame Debugger中新增了一项功能,帮助开发者查找相关信息.今天这篇文章就为 ...
- Unity 5.6中的混合光照(下)
https://mp.weixin.qq.com/s/DNQFsWpZm-ybIlF3DTAk2A 在<Unity 5.6中的混合光照(上)>中,我们介绍了混合模式,以及Subtracti ...
- Unity 5.6中的混合光照(上)
https://mp.weixin.qq.com/s/AbWM21sihHw5pFdMzENDPg 在Unity 5中,光照得到了很大的改进.现在,创建高度逼真的游戏已成为可能.但是,出于对性能的考虑 ...
随机推荐
- IIS出现 分析器错误消息: 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的
这是因为发布的时候按了“生成部署包”
- java线程小结3
1. 多线程概述 要实现多线程可以通过继承Thread和实现Runnable接口.不过这两者之间存在一些区别.其中最重要的区别就是,如果一个类继承Thread类,则不适合于多个线程共享资源,而实现了R ...
- java时区问题的一个坑
事情是这样的,前台传过去一个日期字符串,就像2016/12/15 00:00,2016/12/15 23:59类似的格式,但每次从日志平台查日志查询的时间范围都不对,而是提前了一天. 原因是在java ...
- jsp页面格式时间yy-mm-dd
这个问题把我花了1小时都没弄出来 各种报错 还是最后同学告知才知道的. 导入 :<%@ taglib uri="http://java.sun.com/jsp/jstl/func ...
- <Oracle Database>诊断文件
诊断文件 诊断文件是获取有关数据库活动的信息的一种方式,用于解决数据库出现的一些问题,主要包含有关数据库中出现的重要事件的一些信息,这些文件能更好的对数据库进行日常的管 理,主要类型有一下几种: 警告 ...
- 基于Moodle的IT课程辅助教育平台搭建
基于Moodle的IT课程辅助教育平台搭建 Moodle是一个开源课程管理系统(CMS),也被称为学习管理系统(LMS)或虚拟学习环境(VLE).它已成为深受世界各地教育工作者喜爱的一种为学生建立网上 ...
- [java基础]java中static关键字
1.static概念 static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序 ...
- 插入排序-java
排序-插入排序 基本思想:将待排序表看作左右两部分,其中左边为有序区,右边为无序区, 整个排序过程就是将右边无序区中的元素逐个插入到左边的有序区中,以构成新的有序区. 平均时间:O(n2) 最好情况: ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- 如何在Hdevelop加入自己的算子
halcon中允许用户编写自定义函数,同时也可以将此函数保存在其他工程中调用. 以halcon12讲解 创建自定义函数 本地程序函数:创建后仅能在当前工程使用 hdevelop函数文件 ...