技术开发 频道

NHibernate 基本整合:定义领域层


分离接口

    你将注意到BasicSample.Core项目没有包括数据访问对象执行细节,仅仅端口描述了它需要的服务。操作这些接口的具体的DAO类型能在BasicSample.Data里找到。正如前面所描述的,这个技术被称为Separated Interface.如果你认为BasicSample.Core是一个"高级别",BasicSample.Data 是一个"低级别",然后,正如Robert Martin所描述的:每一个高级别为它需要的服务宣告了一个抽象的接口。然后,从这些抽象的接口中意识到低级别。因此高级别不依赖于低级别。相反,低级别依赖于抽象服务接口(在高级别中宣告的)。

    来看运转中的这一现象,在命名空间BasicSample.Core.DataInterfaces.中描述了数据接口。IDao是一个泛型接口,提供典型数据访问功能。然后,IDaoFactory为一个或者多个DAO 工厂类型而作为接口而工作。IDaoFactory接口的译码允许你为生产代码创建一个具体的DAO工厂,另外一个具体的DAO 工厂为单元测试目的返回DAO 双重测试。(这是一个使用抽象工厂模式的例子)。正如前面在BasicSample.Tests中检测的,综合利用mock objects in unit tests为每次检测一个单一的责任提供了一个方法。

集合泛型

   到现在为止,C# 2.0已经进入表,其中一个最重大的好处就是包括 泛型 。有了泛型 ,当仍然在强烈执行被输入的译码“合同”时,可以有效地完成更多的代码再使用。在这篇文章的上一部分,Ayende 非常有用,但是被反对。NHibernate.泛型 用于连接NHibernate 和.NET 泛型 。但是现在NHibernate 1.2天生支持泛型 ,没必要再需要这个类型库。如果你在过去使用过Ayende 库,首先你要先完完全全从它那移出来,特别是如果你曾使用了自动配线,以此来操作母/子关系。但是不要让它阻止你,即使你没有立即refactor out 自动配线时,你仍然可以更新NHibernate 1.2。在下面Migrating from NHibernate 1.0x to 1.2中能找到从Ayende's NHibernate.泛型refactor 出来所要求的步骤的更多信息。Ayende's NHibernate.泛型 的一起缺点就是需要将内部连接和取值函式 和设值函式一起显示出来。这个损坏封装,允许以在无意识的方法操作或者修改连接-把它看成是 集合 困扰.现在NHibernate生来就支持泛型 ,可能要采用更好的 集合 encapsulation技术。下面来自于Customer.cs 和 Customer.hbm.xml的代码展示了一个更好的泛型 集合s封装。
public IList<Order> Orders { 
get { return new List<Order>(orders).AsReadOnly(); }
protected set { orders = value; }
}

public void AddOrder(Order order) {
if (order != null && !orders.Contains(order)) {
orders.Add(order);
}
}

public void RemoveOrder(Order order) {
if (orders.Contains(order)) {
orders.Remove(order);
}
}

private IList<Order> orders = new List<Order>();

<bag name="orders" table="Orders" inverse="true" cascade="all">
<key column="CustomerID" />
<one-to-many class="BasicSample.Core.Domain.Order, BasicSample.Core" />
</bag>
0
相关文章