.net 数据对象中的业务逻辑与耦合与DTO(与?)

.net 数据对象中的业务逻辑与耦合与DTO(与?),.net,api,dns,business-objects,dto,.net,Api,Dns,Business Objects,Dto,我有一组日历的业务/域类,它们将在内部公共API中公开。在同一个API中,存在直接镜像底层数据库结构NHibernate映射的数据对象,但这并不重要 我需要做的是构建这些对象的类型化集合,这样日历上的每一天都可以包含一组来自数据库的约会、提醒等 一种解决方案是使用域模型中的标记接口标记每个数据对象: public class CalendarAppointment : PersistentEntity, ICalendarObject 但是,我在数据模型中加入了业务/领域模型 另一种解决方案是按

我有一组日历的业务/域类,它们将在内部公共API中公开。在同一个API中,存在直接镜像底层数据库结构NHibernate映射的数据对象,但这并不重要

我需要做的是构建这些对象的类型化集合,这样日历上的每一天都可以包含一组来自数据库的约会、提醒等

一种解决方案是使用域模型中的标记接口标记每个数据对象:

public class CalendarAppointment : PersistentEntity, ICalendarObject
但是,我在数据模型中加入了业务/领域模型

另一种解决方案是按如下方式包装数据模型类,并在日历API中公开/使用这些类:

public class Appointment : CalendarAppointment, ICalendarObject
但这引入了非常明显的耦合

第三种解决方案是使用DTO,但我需要公开DTO中数据对象中的每个字段。。。因此,首先创建DTO似乎没有意义

这里哪一个是最好的选择,还是有更好的选择


这是一个.NET 2.0项目,如果这有区别的话。

当您的业务域模型和数据模型看起来非常相似时,总是很容易绕过DTO

你有没有考虑过修改你的公共API,使它看起来不那么“冗长”


如果你真的做不到这一点,那么就咬紧牙关去做DTO,因为使用API向客户端代码发送NHibernate对象的代价通常是血淋淋的。

我们决定日历对象隐式绑定到数据库,所以这种耦合是可以的。我们最终采用了解决方案4封装FTW:

public class Appointment : ICalendarObject
{
    public CalendarAppointment Item { get; }
}

我应该澄清,我将编辑我的问题。我所说的API将在内部公开-计划是它将用于开发我们的基础产品,并扩展基础产品的功能。这是遗留系统迁移的一部分,其中有几个客户与基础产品存在巨大差异。如上所述,我们已经将数据结构类与数据层查询分开,但这两个方面都必须在API中公开。