领域驱动设计案例之实现业务3

这一部分主要介绍如何实现下订单的业务,下订单的业务主要涉及到SalesOrder,OrderItem,CustomerInfo与ProductInfo几个领域对象

  public partial class ProductInfo:ValueObject
    {
        public ProductInfo(Product product)
        {
            this.Id = base.Id;
            this.Name = product.ProductName;
            this.UnitPrice = product.UnitPrice;
        }
    }
 public partial class CustomerInfo:ValueObject
    {
        public CustomerInfo(Customer customer,Address address)
        {
            this.Id = base.Id;
            this.Name = customer.Name;
            this.Mobile = customer.Mobile;
            this.State = address.State;
            this.City = address.City;
            this.Street = address.Street;
        }
    }
public partial class OrderItem:Entity
    {
        public OrderItem(Product product,int amount)
        {
            this.Id = base.Id;
            this.Amount = amount;
            this.LineTotal = product.UnitPrice * Amount;
        }
    }
 public partial class SalesOrder:AggreateRoot
    {
        private IRepository<SalesOrder> irepository;
        public SalesOrder(IRepository<SalesOrder> irepository)
        {
            this.irepository = irepository;
        }
        public void CreateOrder(List<Product> products,Customer customer,List<int> amounts,
            string state,string city,string street)
        {
            SalesOrder salesorder = new SalesOrder();
            salesorder.Id = base.Id;
            salesorder.DateTime = DateTime.Now;
            salesorder.CustomerInfo =
                new CustomerInfo(customer, new Address(state, city, street));
            for(int i=0;i<products.Count;i++)
            {
                var orderitem = new OrderItem(products[i], amounts[i]);
                orderitem.ProductInfo = new ProductInfo(products[i]);
                salesorder.OrderItem.Add(orderitem);
                salesorder.TotalPrice = salesorder.TotalPrice + orderitem.LineTotal;
            }

            irepository.Create(salesorder);
        }       
    }

在下订单时,因为会涉及到多个聚合根的协作,所以在DDD.Domain中引入一个领域服务SalesOrderService来进行协调,比如订单项添加成功后,产品的库存 也要相应减少。

 public class SalesOrderService
    {
        private IRepository<Product> irepositoryproduct;
        private IRepository<Customer> irepositorycustomer;
        private IRepository<SalesOrder> irepositorysalesorder;
        public SalesOrderService(IRepository<Product> irepositoryproduct
            ,IRepository<Customer> irepositorycustomer
            ,IRepository<SalesOrder> irepositorysalesorder)
        {
            this.irepositoryproduct = irepositoryproduct;
            this.irepositorycustomer = irepositorycustomer;
            this.irepositorysalesorder = irepositorysalesorder;
        }
        public void CreateSalesOrder(List<string> productnames,List<int> amounts,
            string customername,string state,string city,string street)
        {
            var listproduct = new List<Product>();
            for(int i=0;i<productnames.Count;i++)
            {
                var product =
                    new Product(irepositoryproduct).GetProducyByName(productnames[i]);
                product.ModifyCount(product, amounts[i], irepositoryproduct);

                listproduct.Add(product);
            }
            var customer = new Customer(irepositorycustomer).GetCustomerByName(customername);
            var salesorder = new SalesOrder(irepositorysalesorder);

            salesorder.CreateOrder(listproduct, customer, amounts, state, city, street);
        }
    }

最后在DDD.Application中建立一个应用层服务,实现事务提交(这里只演示SalesOrder应用服务,产品与客户的应用服务提交情况类似)

  public class SalesOrderAppService
    {
        EFRepositoryContext context = new EFRepositoryContext();

        public void CreateSalesOrder(List<string> productnames,
            List<int> amounts,string customername,string state,string city,string street)
        {
            var salesorderservice = new SalesOrderService
                (new ProductRepository(), new CustomerRepository(), new SalesOrderRepository());
            salesorderservice.CreateSalesOrder(productnames, amounts, customername,
                state, city, street);

            context.Commit();
        }
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

linq to sql 扩展方法

840
来自专栏互联网开发者交流社区

STC-单片机控制系统

2033
来自专栏菩提树下的杨过

如何给已经有数据的DataTable动态增加一列并赋值

以前手写sql的时代,我们经常用DataTable,自从用Linq后,很少用DataTable这些原始的东东了,近日在开发中遇到一些特殊情况,用户要求临时在显示...

2749
来自专栏大内老A

开发自己的Data Access Application Block[下篇]

上接:[原创] 我的ORM: 开发自己的Data Access Application Block - Part I 4. Database 下面来介绍重中之重...

2416
来自专栏菩提树下的杨过

几种常见复合sql查询语句的linq写法[继续补充中]

1.IN 语句 尝试了很多次,好象linq死活不生成in语句,无奈只能做了下变换 例,要找出"手机大类"以及"手机下属所有子类"的产品 (手机大类的ID为D0...

2466
来自专栏hbbliyong

.Net下SQLite的DBHelp

怎样获取SqLite请参考初识SqlLite ---.net连接数据库,怎样在SQLite使用Linq请参考在C#中利用Nuget包使用SQLite数据库和Li...

3244
来自专栏个人随笔

C#编写影院售票系统(A project with a higher amount of gold )(2:相关代码)

此篇文章为项目代码,,,需要项目需求 ,思路分析与窗体效果请访问:http://www.cnblogs.com/lsy131479/p/8367304.html...

3385
来自专栏Golang语言社区

厚土Go学习笔记 | 13. 用循环和函数 实现Sqrt(x)

利用前面学习的循环和函数,来实现 Sqrt(x)。并且与math.Sqrt(x)的结果做一下比较。 这个很有意思,所以,把中间不断带入的变化值都打印出来。 使用...

3566
来自专栏菩提树下的杨过

.Net3.0中的自动属性(示例)

using System; namespace LinqDemo {     class Program     {         stat...

2028
来自专栏海说

JTable常见用法细则+设置某列可编辑+滚动表格

JTable常见用法细则 JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处. 一. 创建表...

4860

扫码关注云+社区

领取腾讯云代金券