zoukankan      html  css  js  c++  java
  • SOA与DDD架构

    以下内容为本人相关知识读后总结,细节完全参考风尘浪子《结合领域驱动设计的SOA分布式软件架构》

    地址:http://www.cnblogs.com/leslies2/archive/2011/12/12/2272722.html#t1

    SOA DDD

    具体应用程序的功能是由一些松耦合并且

    具有统一接口的组件(Service)组建起来

    主要针对多核心多平台之间的交互

    领域驱动设计

    将企业内部复杂的业务流程转成服务或软件

    大型系统的总体架构(注重项目分离,隔离开发),最终系统合并

    单个项目开发管理过程

    分为:基础设施层(类似DAL)

         领域层(BLL)

       应用层(用来协调表现层与领域层)

       表现层

    实现依赖于模型驱动设计(Model-Driven-Design)

    Model包含(Entity带标识符实体,ValueObject实体属性,Service)

    细说Model

      1.Entity(带标示符)

       

    public partial class Order:IRoot
    {
        private Guid _guid;
        public Order()
        {    _guid=new Guid.NewGuid(); }
        public Guid GUID
        {get {return _guid;}}
    
    public partial class Person:IRoot
    {
        private Guid _guid;
        public Order()
        {    _guid=new Guid.NewGuid(); }
        public Guid GUID
        {get {return _guid;}}

        OrderItem作为Order的值对象ValueObject     List<OrderItem>

      2.Repository原则(分界管理)

      OrderRepository只关注Order的CRUD,不包括Person,OrderItem作为Order的ValueObject,CRUD也应放在此Repository中。

      例如:

    public interface IOrderRepository
    {Ilist<Order> GetLIstByPerson(int PID);
       ......CRUD}
    
    public interface IPersonRepository
    {Ilist<Person> GetList(int PID);
       ......CRUD}
    
    
    以ADO.NET Entity Framework为例
    //获取
    _context.Order.Include("OrderItem").where(x=>x.ID==id);
    //更新
    public int UpdateOrder (Order order)
    {
        1.事务 tanscationScope
        2.获取Order对象 参数 order.id
        3.赋值更改
        4.删除原有的OrderItem
        5.遍历添加新OrderItem
        6.SaveChange();
    }

      3.领域层服务

       复杂的业务逻辑-----》领域服务类 

       例:在Order表里记录的是每次交易的过程,每次商品的送货费(Freightage)为10元,当商品价格(Price)超过98元可免费送货,当用户 Person积分(Point)超过2000分可获7折优惠(Favorable),1000~2000分可获8折,1000分以下可有9折,最后总体价 格为为(TotalPrice)。

       

    public class AccountManager
    {
        private Person _person;
        private Order _order;
        public AccountManager(Person person, Order order)
        {
            _person =person;
            _order= order;
        }
        public void Account()
        {
            GoodsCount();
            PricesCount();
            FavorableCount();
            double price1=(_order.Price - _order.Favorable).value;
            FreightageAccount(price1);
            _order.TotalPrice=price1+_order.Freightage.Value);
        }
    }

      4.应用层(SOA系统中的应用层)

    SOA系统中的应用层

    特点:1.协调领域层的工作,只会领域对象解决业务,但本身不参与业务状态

       2.承担数据运输中心和信息发放端口的责任(数据的转换和收发)

    如:调用领域服务类AccountManager和PaymentManager完成复杂业务逻辑

    粗粒度         

    分布式系统:假定外界对系统内部毫不了解,用户只需要舒服数据,等待返回结果,

          不关心业务逻辑。

          (数据结果封装在数据传输对象DTO)

          如:页面需要三个对象的一些属性,Person,Order,OrderItem则值需

          将3个类的属性封装成DTO对象(也就是粗粒度元素数据)

    传输型 

    SOA系统,应该从性能上出发,优先考虑粗粒度元素的传输型问题。如:原有Person

           与Order为一对多关系,但是表现层需求只为11关系,则DTO返回传输,

         应以11关系为主

    封装性  

    利用Facade模式把一些功能封装在少数的几个服务里

    如:表示层Client需要涉及多个类的功能,如Person,Order,OrderItem的Account等

      功能。则此时创建OrderService,隔开表示层与多个类的交互,直接交互Facade对象

      OrderService 的Account功能。

        Ps:Facade外观模式

        

    外观模式
    例:保安有三个设备警铃、监视器、灯,如果要将其全部打开,则要接触三者对象,外观模式则帮助创建Facade对象,保安直接接触facade对象完成打开操作即可。隔开三者对象与保安的耦合关系
    三个对象
    public class Ring
                       Sensor
                       Light
    facade对象
    public class Facade
    {Ring=new; Sensor=new;Light=new;
        void Open(){
            Ring.Open(); Sensor.Open();Light.Open();
        }
    }
    Client对象
    public class Client
    {
        Facade f=new ;
        f.Open();
    }


       5.应用层的协调性(领域层与表现层)

        应用层利用Repository完成实体CRUD操作,并调用领域层的服务来管理逻辑

        如:OrderService通过调用领域服务AccountManager,PaymentManager等领域服务,完成复杂业务逻辑

        

    public class OrderService
    {
        private IOrderRepository orderRepository=DataAccess.CreatOrderRepository();
        private void Account(Order order)
        {
        IPersonRepository =CreatPersonRepository();
        Person p= personRepository.GetPerson();
        Account acount........}

        数据转换过程

        OperationAssembler类作为数据转换器,将多个类对象转成表示层所需要的DTO对象。

       7架构图

        

  • 相关阅读:
    python爬虫简单代码爬取郭德纲单口相声
    WordPress 新版本中编辑器不好用, 使用原有编辑器
    hexo博客更新主题后上传Git操作
    Flask的Context(上下文)学习笔记
    Flask 中的 特殊装饰器before_request/after_request
    Flask 中的 CBV 与上传文件
    Flask 中的蓝图(BluePrint)
    【openresty】获取post请求数据FormInputNginxModule模块
    【随笔】Linux服务器备份相关
    【WMware】关于VMware服务器虚拟化管理之服务器容量扩充
  • 原文地址:https://www.cnblogs.com/ruanyifeng/p/2970767.html
Copyright © 2011-2022 走看看