您的位置:首页 > 运维架构 > 网站架构

[.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店

2015-05-12 10:03 936 查看

一、前言

  在前面专题一中,我已经介绍了我写这系列文章的初衷了。由于dax.net中的DDD框架和Byteart Retail案例并没有对其形成过程做一步步分析,而是把整个DDD的实现案例展现给我们,这对于一些刚刚接触领域驱动设计的朋友可能会非常迷茫,从而觉得领域驱动设计很难,很复杂,因为学习中要消化一个整个案例的知识,这样未免很多人消化不了就打退堂鼓,就不继续研究下去了,所以这样也不利于DDD的推广。然而本系列可以说是刚接触领域驱动设计朋友的福音,本系列将结合领域驱动设计的思想来一步步构建一个网上书店,从而让大家学习DDD不再枯燥和可以看到一个DDD案例的形成历程。最后,再DDD案例完成之后,将从中抽取一个领域驱动的框架,从而大家也可以看到一个DDD框架的形成历程,这样就不至于一下子消化一整个框架和案例的知识,而是一步步消化。接下来,该专题将介绍的是:结合领域驱动设计的SOA架构来构建网上书店,本专题中并没有完成网上书店的所有页面和覆盖DDD中的所有内容,而只是一部分,后面的专题将会在本专题的网上书店进行一步步完善,通过一步步引入DDD的内容和重构来完成整个项目。

二、DDD分层架构

  从概念上说,领域驱动设计架构主要分为四层,分别为:基础设施层、领域层、应用层和表现层。

基础结构层:该层专为其他各层提供各项通用技术框架支持。像一些配置文件处理、缓存处理,事务处理等都可以放在这里。

领域层:简单地说就是业务所涉及的领域对象(包括实体、值对象)、领域服务等。该层就是所谓的领域模型了,领域驱动设计提倡是富领域模型,富领域模型指的是:尽量将业务逻辑放在归属于它的领域对象中。而之前的三层架构中的领域模型都是贫血领域模型,因为在三层中的领域模型只包含业务属性,而不包含任何业务逻辑。本专题的网上书店领域模型目前还没有包含任何业务逻辑,在后期将会完善。

   实体可以认为对应于数据库的表,而值对象一般定义在实体类中。

应用层:该层不包含任何领域逻辑,它主要用来对任务进行协调,它构建了表现层和领域层的桥梁。SOA架构就是在该层进行实现的。

表现层:指的是用户界面,例如Asp.net mvc网站,WPF、Winform和控制台等。它主要用来想用户展现内容。

  下面用一个图来形象展示DDD的分层架构:

// 服务定位器的实现
public class ServiceLocator : IServiceProvider
{
private readonly IUnityContainer _container;
private static ServiceLocator _instance = new ServiceLocator();

private ServiceLocator()
{
_container = new UnityContainer();
_container.LoadConfiguration();
}

public static ServiceLocator Instance
{
get { return _instance; }
}

#region Public Methods

public T GetService<T>()
{
return _container.Resolve<T>();
}

public IEnumerable<T> ResolveAll<T>()
{
return _container.ResolveAll<T>();
}

public T GetService<T>(object overridedArguments)
{
var overrides = GetParameterOverrides(overridedArguments);
return _container.Resolve<T>(overrides.ToArray());
}

public object GetService(Type serviceType, object overridedArguments)
{
var overrides = GetParameterOverrides(overridedArguments);
return _container.Resolve(serviceType, overrides.ToArray());
}

#endregion

#region Private Methods
private IEnumerable<ParameterOverride> GetParameterOverrides(object overridedArguments)
{
var overrides = new List<ParameterOverride>();
var argumentsType = overridedArguments.GetType();
argumentsType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.ToList()
.ForEach(property =>
{
var propertyValue = property.GetValue(overridedArguments, null);
var propertyName = property.Name;
overrides.Add(new ParameterOverride(propertyName, propertyValue));
});
return overrides;
}
#endregion

#region IServiceProvider Members

public object GetService(Type serviceType)
{
return _container.Resolve(serviceType);
}

#endregion
}


View Code

七、UI层的实现

  根据领域驱动的分层架构,接下来自然就是UI层的实现了,这里UI层的实现采用Asp.net MVC 技术来实现的。UI层主要包括商品首页的实现,和详细商品的实现,另外还有一些附加页面的实现,例如,关于页面,联系我们页面等。关于UI层的实现,这里就不一一贴出代码实现了,大家可以在最后的源码链接自行下载查看。

八、系统总体架构

  经过上面的所有步骤,本专题中的网上书店构建工作就基本完成了,接下来我们来看看网上书店的总体架构图(这里架构图直接借鉴了dax.net的图了,因为本系列文章也是对其Byteart Retail项目的剖析过程):



  最后附上整个解决方案的结构图:



九、网上书店运行效果

  实现完之后,大家是不是都已经迫不及待地想看到网上书店的运行效果呢?下面就为大家来揭晓,目前网上书店主要包括2个页面,一个是商品首页的展示和商品详细信息的展示。首先看下商品首页的样子吧:



  图书的详细信息页面:



十、总结

  到这里,本专题的内容就介绍完了, 本专题主要介绍面向领域驱动设计的分层架构和面向服务架构。然后结合它们在网上书店中进行实战演练。在后面的专题中我会在该项目中一直进行完善,从而形成一个完整了DDD案例。在接下来的专题会对仓储的实现应用规约模式,在应用之前,我会先写一个专题来介绍规约模式来作为一个准备工作。

  GitHub 开源地址:https://github.com/lizhi5753186/OnlineStore
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐