添加程序集:

写一个接口:

  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"));
}

DDD领域模型企业级系统Unity(五)的更多相关文章

  1. DDD领域模型企业级系统(二)

    用户层: 1.请求应用层获取用户显示的信息 2.发送命令给应用层要求执行某个命令 应用层: 对用户界面提供各种应用功能(包括信息获取与命令执行),应用层不包含业务逻辑,业务层是由应用层调用领域层(领域 ...

  2. DDD领域模型企业级系统(一)

    领域模型的基本构造块: 1.实体(Entity):有业务生命周期,使用标识进行跟踪. 2.值对象(Value Object):无业务生命周期,用来描述实体. 3.服务(Service):无状态的行为类 ...

  3. DDD领域模型企业级系统Linq的CRUD(四)

    建造一个Product Module类: ProductDBContextDataContext dbcontext = new ProductDBContextDataContext(); publ ...

  4. DDD领域模型企业级系统(三)

    相关代码: public static void ShowArray() { //数据源 int[] arrayas = new int[] { 1, 2, 3, 4 }; //创建查询 var qu ...

  5. DDD领域模型和充血对象

    DDD领域模型 官方说法 领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略 ...

  6. Android系统的五种数据存储形式(一)

    Android系统有五种数据存储形式,分别是文件存储.SP存储.数据库存储.contentprovider 内容提供者.网络存储.其中,前四个是本地存储.存储的类型包括简单文本.窗口状态存储.音频视频 ...

  7. 【百度地图API】建立全国银行位置查询系统(五)——如何更改百度地图的信息窗口内容?

    原文:[百度地图API]建立全国银行位置查询系统(五)--如何更改百度地图的信息窗口内容? 摘要: 酷讯.搜房.去哪儿网等大型房产.旅游酒店网站,用的是百度的数据库,却显示了自定义的信息窗口内容,这是 ...

  8. Android系统--输入系统(五)输入系统框架

    Android系统--输入系统(五)输入系统框架 1. Android设备使用场景: 假设一个Android平板,APP功能.系统功能(开机关机.调节音量).外接设备功能(键盘.触摸屏.USB外接键盘 ...

  9. DDD领域模型实现依赖注入(六)

    添加下订单的值对象: public partial class CustomerInfo:ValueObject { /// <summary> /// 下订单的值对象 /// </ ...

随机推荐

  1. Luogu4768 NOI2018归程(最短路径+kruskal重构树)

    按海拔从大到小合并建出kruskal重构树,这样就能知道开车能到达哪些点,对这些点到1的最短路取min即可.最难的部分在于多组数据的初始化和数组大小的设置. #include<iostream& ...

  2. Trips CodeForces - 1037E(思维dfs)

    题意: 就是几个人去旅游,组队的条件是对于某个队员 队里至少有两个是他的朋友,每天早晨都会有一对新人成为朋友 解析: 用set标记互为朋友 a[i] b[i] 表示在第i天早晨 u和v成为朋友 先求最 ...

  3. eclipse 安装报错

    14 11:17:13] ERROR: org.eclipse.equinox.p2.transport.ecf code=1002 Unable to read repository at http ...

  4. 【BZOJ1228】[SDOI2009]E&D(博弈论)

    [BZOJ1228][SDOI2009]E&D(博弈论) 题面 BZOJ 洛谷 题解 这种打表找规律的题目真的不知道可以说什么好啊... #include<iostream> #i ...

  5. 洛谷 P5108 仰望半月的夜空 解题报告

    P5108 仰望半月的夜空 题目描述 半月的夜空中,寄托了多少人与人之间的思念啊 曦月知道,这些思念会汇集成一个字符串\(S(n = |S|)\) 由于思念汇集的过于复杂,因此曦月希望提炼出所有的思念 ...

  6. Luogu2661 信息传递(图论)

    Luogu2661 信息传递(图论) Description 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti ...

  7. Python数据分析初始(一)

    基础库 pandas:python的一个数据分析库(pip install pandas) pandas 是基于 NumPy 的一个 python 数据分析包,主要目的是为了 数据分析 .它提供了大量 ...

  8. node.js原生后台进阶(一)

    后台对于我们前端来说可能真的有点陌生,下面我来理清一下思绪吧. 一个基本的后台要求有如下功能: 1.与前端的数据交互 2.操作数据库(增删改查) 3.操作服务器文件(也大概是增删改查) 本次我们先讨论 ...

  9. Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页

    欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...

  10. Scala进阶之路-Scala的基本语法

    Scala进阶之路-Scala的基本语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数式编程初体验Spark-Shell之WordCount var arr=Array( ...