DDD领域模型企业级系统Unity(五)

添加程序集:

 

写一个接口:

  public interface IPlayer
    {
        void Play();
    }

 两个实现类:

     public class NewPlay : IPlayer
        {
            public void Play()
            {
                MessageBox.Show("NewPlay");
            }
        }

  public void Play()
        {
            
            MessageBox.Show("OldPlay");
        }

 ServiceLocator类:

  public class ServiceLocator
    {
        IUnityContainer container = new UnityContainer();
        public ServiceLocator()
        {            
            container.RegisterType<IPlayer, NewPlay>("new");
            container.RegisterType<IPlayer, OldPlay>("old");
        }

        public IUnityContainer GetContainer()
        {
            return container;
        }
    }

 调用:获取一个和全部

  ServiceLocator servicelocator =
                new ServiceLocator();
            var iplay = servicelocator.GetContainer().Resolve<IPlayer>("new");
            var iplays = servicelocator.GetContainer().ResolveAll<IPlayer>();
            foreach(var iplay in iplays)
            {
                iplay.Play();
            }

 构造函数的调用:

  [InjectionConstructor]
        public OldPlay()
        {
            MessageBox.Show("构造函数被执行");
        }

 

 var iplay = servicelocator.GetContainer().Resolve<IPlayer>("old");

属性注入:

写一个类:

 public class Person
    {
        public string Name { get { return "孙"; } }
        public int Age { get { return 32; } }
    }

 

[Dependency]
        public Person person { get; set; }

 自动实例化

 public void Play()
            {
                MessageBox.Show("OldPlay "+person.Name);
            }

 

方法调用注入:

  public Person person { get; set; }

public void Play()
            {
               
                MessageBox.Show("OldPlay");
            }

        [InjectionMethod]
        public void Auto(Person person)
        {
            MessageBox.Show("注入方法 "+person.Name);
        }

 依赖注入的原理:

添加ProductRepository的仓储:(给聚合根建立仓储)

 public class ProductRepository:EFRepository<Product>
    {

    }

 添加SalesOrderRepository的仓储:

 public class SalesOrderRepository:EFRepository<SalesOrder>
    {
    }

 添加ProductRepository的仓储:

 public class ProductRepository:EFRepository<Product>
    {

    }

添加CustomerRepository的仓储:

 public class CustomerRepository:EFRepository<Customer>
    {
    }

定义一个实现Product领域逻辑的部分类(继承聚合根):

public partial class Product:AggreateRoot
    {
        //定义仓储的接口
        private IRepository<Product> irepository;
        //由调用方指定具体仓储的实现
        public Product(IRepository<Product> irepository)
        {
            this.irepository = irepository;
        }
        //默认构造函数
        public Product()
        { }

        /// <summary>
        /// 实现自身聚合根的职责
        /// </summary>
        /// <param name="name"></param>
        /// <param name="color"></param>
        /// <param name="size"></param>
        /// <param name="count"></param>
        /// <param name="unitprice"></param>
        /// <param name="categoryname"></param>
        /// <param name="description"></param>
        public void CreateProduct(string name,string color,string size,int count,
            decimal unitprice,string categoryname,string description)
        {
            var product = new Product();
            product.Id = base.Id; //聚合根的ID
            product.ProductName = name;
            product.Color = color;
            product.Size = size;
            product.Count = count;
            product.UnitPrice = unitprice;
            //聚合根下面的实体和值对象
            var productcategory = new ProductCategory(categoryname,description);
            product.ProductCategory = productcategory;
            //添加到仓储中把对象维护起来
            irepository.Create(product);

        }
        /// <summary>
        /// 减少库存的责
        /// </summary>
        /// <param name="p"></param>
        /// <param name="amount"></param>
        /// <param name="irepository"></param>
        public void ModifyCount(Product p,int amount,IRepository<Product> irepository)
        {
            p.Count = this.Count - amount;
            irepository.Update(p);
        }
      
        public Product GetProducyByName(string productname)
        {
            return irepository.GetByCondition(p => p.ProductName == productname)
                .FirstOrDefault();
        }
    }

定义一个值对象:(负责维护自己的领域逻辑和状态信息)

public abstract class ValueObject : IValueObject
    {
        public Guid Id
        {
            get
            {
                var id = Guid.NewGuid();
                return id;
            }
        }       
    }

 public interface IValueObject
    {
        Guid Id { get; }
    }

 产品类别的逻辑:

 public partial class ProductCategory:ValueObject
    {
        public ProductCategory(string categoryname,string description)
        {
            this.Id = base.Id;
            this.CategoryName = categoryname;
            this.Description = description;
        }
    }

 地址的值对象:

    /// <summary>
    /// 值对象
    /// </summary>
    public partial class Address:ValueObject
    {
        public Address(string state,string city,string street)
        {
            this.State = state;
            this.City = city;
            this.Street = street;
        }
    }

 定义一个实现Customer领域逻辑的部分类(继承聚合根):

  public partial class Customer:AggreateRoot
    {
        //定义仓储接口
        private IRepository<Customer> irepository;
        //构造函数
        public Customer(IRepository<Customer> irepository)
        {
            this.irepository = irepository;
        }
       
        public void CreateCustomer(string name,string mobile,string state,string city,
            string street)
        {
            Customer customer = new Customer();
            customer.Id = base.Id;
            customer.Name = name;
            customer.Mobile = mobile;
            addcustomeraddress(customer, state, city, street);
            irepository.Create(customer);
        }
      
        /// <summary>
        /// 添加地址
        /// </summary>
        /// <param name="customer"></param>
        /// <param name="state"></param>
        /// <param name="city"></param>
        /// <param name="street"></param>
        private void addcustomeraddress(Customer customer,string state,string city,string street)
        {
            //值对象
            var address = new Address(state, city, street);
            //添加地址
            customer.Address.Add(address);
        }

        public void AddCustomerOtherAddress(Customer customer,string state,string city,
            string street)
        {
            addcustomeraddress(customer, state, city, street);
            irepository.Update(customer);
        }

        public Customer GetCustomerByName(string name)
        {
            return irepository.GetByCondition(p => p.Name == name).FirstOrDefault();
        }
    }

单元测试(添加引用):

单元测试:

 EFRepositoryContext context =
            new EFRepositoryContext();
        [TestMethod]
        public void CreateProduct()
        {
            //Product product = new Product(new ProductRepository());
            ProductAppService product = new ProductAppService();          
            product.CreateProduct("P1", "Red", "Small", 100, 55, "C1", "T恤类产品");
            product.CreateProduct("P2", "Green", "Big", 200, 40, "C2", "运动类产品");
            context.Commit();
            Assert.IsNotNull(product.GetProductByName("P1"));          

        }

        [TestMethod]
        public void CreateCustomer()
        {
            Customer customer = new Customer(new CustomerRepository());
            customer.CreateCustomer("sun", "13458629365", "sanxi", "sanxi", "sanxi");
            context.Commit();
            Assert.IsNotNull(customer.GetCustomerByName("sun"));
        }

 

posted @ 2017-03-19 21:55  石shi  阅读(316)  评论(0编辑  收藏  举报