DDD分层架构

  • 架构是高层的设计,若设计有误和理解有误,必将在实现时带来问题。
  • 结构是最稳定的,不存在具体技术的依赖。
4933701-a765829a0d2b784b.png
三层模型与DDD对比

设计方案1

4933701-f81ebbfaafda0c6e.png
image.png

搭建解决方案

  • DDD.UI 用户接口层 ASP.NET MVC空项目
  • DDD.Application 应用层类库项目
  • DDD.Domain 领域层类库项目
  • DDD.Infrastructure 基础设施层类库项目
  • DDD.Repository 仓储类库项目
4933701-e67babb267007bdc.png
DDD分层架构

项目间引用

  • DDD.UI 添加 DDD.ApplicationDDD.DomainDDD.InfrastructureDDD.Repository的引用
  • DDD.Application 添加 DDD.DomainDDD.Infrastructure 的引用
  • DDD.Domain 添加 DDD.Infrastructure 的引用
  • DDD.Repository 添加 DDD.DomainDDD.Infrastructure 引用
4933701-90df754b4701e927.png
项目间引用

依赖注入

  • 为更彻底的解耦,对依赖注入的实现应用依赖倒置原则。
  • 不依赖任何具体的IoC框架及其类和版本
  • 在基础设施层中实现2中不同IoC框架
  • 在使用时展示通过直接注入和通过反射两种方式
  • 通过反射可将IoC的实现依赖通过配置文件管理
4933701-c19c0c0043b0c4d1.png
依赖注入
using System;

namespace DDD.Infrastructure.IoC
{
    /// <summary>
    /// IoC抽象接口
    /// </summary>
    interface IIoCContainer
    {
        object GetInstance(Type type);
        T GetInstance<T>();
        T[] GetInstances<T>();
        void Init();
        void Add();
    }
}
namespace DDD.Infrastructure.IoC
{
    /// <summary>
    /// IoC管理类
    /// </summary>
    class IoCEngine
    {
        private static IIoCContainer _container;
        public static IIoCContainer Container
        {
            get
            {
                return _container;
            }
        }
        public static void Init(IIoCContainer container)
        {
            container.Init();
            _container = container;
        }
    }
}
4933701-87c615bc16ade73b.png
image.png

问题:

  • 更像是以基础设施层为核心
  • 仓储无法置于基础设施层
  • 领域层对外有依赖
  • 代码和架构无法对应

设计方案2

4933701-9429c04233611647.png
DDD

项目间引用

  • DDD.UI 展现层添加DDD.ApplicationDDD.DomainDDD.Infrastructure的引用
  • DDD.Application 添加 DDD.DomainDDD.Infrastructure的引用
  • DDD.Infrastructure 添加 DDD.Domain 的引用

改善

  • 领域层不再依赖基础设施层
  • IEntity和IRepository接口定义在领域层
  • Repository仓储真正在基础设施层实现

优势

  • 代码图和架构图完美对应
  • 领域层为中心
  • 不用为基础设施层无法引用领域层,而在领域层添加不必要的代码。

设计方案3

4933701-cb1bed7a4b9dd856.png
image.png

项目间引用关系

  • DDD.UI 添加 DDD.ApplicationDDD.DomainDDD.Infrastrcutre的引用
  • DDD.Application 添加 DDD.Domain 的引用
  • DDD.Infrastrcutre 添加 DDD.ApplicationDDD.Domain引用

优势

  • 将IService接口定义在应用层
  • 进一步将所有哦依赖的接口定义在领域层和应用层,包括 依赖注入管理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值