我正在看着 differences between POCO and DTO(似乎POCO是dto的行为(方法?)),并由Martin Fowler在07年由贫血领域模型出现。

通过缺乏理解,我想我已经创造出了这些贫血域模型之一。

在我的一个应用程序中,我的业务域实体在’dto’dll中定义。他们有很多属性与吸气者和设置者,没有太多的其他。我的业务逻辑代码(填充,计算)在另一个“bll”DLL中,我的数据访问代码是一个“dal”dll。 “最佳实践”我想。

所以通常我会这样创建一个dto:

dto.BusinessObject bo = new dto.BusinessObject(...)

并将其传递给bll层,如下所示:

bll.BusinessObject.Populate(bo);

这又反过来执行一些逻辑,并将其传递给dal层,如下所示:

dal.BusinessObject.Populate(bo);

从我的理解,要使我的dto进入POCO,我需要使业务逻辑和行为(方法)成为对象的一部分。所以代替上面的代码更像是:

poco.BusinessObject bo = new poco.BusinessObject(...)
bo.Populate();

即。我正在调用对象上的方法,而不是将对象传递给该方法。

我的问题是 – 我该如何做到这一点,仍然保留“最佳实践”分层关注(单独的dll等)。不调用对象上的方法意味着方法必须在对象中定义?

请帮助我的困惑。

通常,您不想将持久性引入您的域对象,因为它不是该业务模型的一部分(飞机不构建自身,它将乘客/货物从一个位置飞到另一个位置)。您应该使用 repository pattern, ORM framework或其他数据访问模式来管理对象状态的持久存储和恢复。

贫血域模型的出现在你做这样的事情时:

IAirplaneservice service = ...;
Airplane plane = ...;
service.FlyAirplanetoAirport(plane,"IAD");

在这种情况下,飞机的状态(无论是飞行,在哪里,起飞时间/机场,到达时间/机场是什么,什么是飞行计划等)的管理被委托给飞机外部的东西。 Airplaneservice实例。

实现这一点的POCO方式是以这种方式设计你的界面:

Airplane plane = ...;
plane.FlyToAirport("IAD");

这是更可发现的,因为开发者知道在哪里寻找飞机飞行(只是告诉飞机去做)。它还允许您确保状态仅在内部进行管理。然后,您可以将当前位置的内容像只读方式一样,并确保它只在一个地方更改。随着贫血域对象,由于状态设置为外部,发现状态改变的地方变得越来越困难,因为您的域的规模越来越大。

POCO,DTO,DLL和贫血域模型的更多相关文章

  1. php – 你会如何为这个应用程序建模?

    如果数据模型变得更复杂怎么办?所有这些都是你拥有域模型的原因,为什么它实际上是MVC的基本构建块:最终,用户拥有的心智模型将与数据模型不同步,原因有多种,我不会进入这里.关键是,它几乎总是发生.我确定这是必要的吗?我是否肯定这不仅仅是矫枉过正,一堆仪式咒语对于这么小的项目毫无意义?

  2. PHP中的数据传输对象,许多具有相同上下文名称的类

    我刚才发现有这种DTO模式.我怀疑是否它们很有用.我的意思是,我应该将所有域对象映射到相应的DTO对象并将它们分配给查看域对象本身吗?

  3. php – 将业务逻辑放在实体中

    我已经阅读了福勒关于“贫血领域模型”的文章(链接:http://www.martinfowler.com/bliki/AnemicDomainModel.html),我同意他的观点.我试图创建一个实体是简单POPO的应用程序,但是这样,我有一个胖服务层,而将一些逻辑放到实体中将是最简单的解决方案.所以我会有这样的架构:哪里:实体:将是简单的POPO,只是一袋二传手和吸气剂模型:将是用业务逻辑装饰的

  4. POCO,DTO,DLL和贫血域模型

    )),并由MartinFowler在07年由贫血领域模型出现。通过缺乏理解,我想我已经创造出了这些贫血域模型之一。所以通常我会这样创建一个dto:并将其传递给bll层,如下所示:这又反过来执行一些逻辑,并将其传递给dal层,如下所示:从我的理解,要使我的dto进入POCO,我需要使业务逻辑和行为(方法)成为对象的一部分。实现这一点的POCO方式是以这种方式设计你的界面:这是更可发现的,因为开发者知道在哪里寻找飞机飞行。

  5. java – 创建新的实例类引用

    我有一个这样的枚举:所有这些dto类都扩展了相同的抽象类:这将是TestADto的示例Dto实现:是否有可能在枚举引用类中创建这些的具体实例,而不需要知道它具体是什么?让我说在一个函数中的某个点,即时通讯具有Enum_A.现在我想创建一个dto实例.对此最好的方法或模式是什么?我想要达到的一切是将dto名称分配给枚举,以便稍后在某些特定点创建它.但如果可能的话,不要创造巨大的条件……

  6. java – 在创建,更新和获取休息端点中相同/不同的DTO对象?

    考虑使用UserDTO类和UserController公开端点来创建,更新和获取用户.在UserDTO类中具有id属性对于创建和更新没有意义.如果我使用swagger或其他自动生成的api文档,那么它会显示id可以在createendpoint中传递.但系统不使用它,因为ID是在内部生成的.如果我看看get那么可能我可以摆脱id属性,但它肯定是在列表用户端点.我想在get/list端点返回内部用户域对象.这样我就可以从UserDTO类中删除id属性.我可以为此采用更好的选择吗?

  7. java – 域模型映射器应该是静态的吗?

    在我参与的许多项目中,我们经常会有很多类将内容从一个域模型映射到另一个域模型.例如,从WSDL生成的模型到项目特定的模型.例如这也可以是一个非静态方法,服务层可以有一个映射器对象字段,而不是调用静态方法:我发现两种方法都使用了很多,但是:>以任何方式提高效率的解决方案之一?>任何解决方案都被认为是最佳实践吗?

  8. c# – 域驱动设计的存储库模式是否成为反模式?

    请考虑以下示例图像,我想说的话.解决方法我同意IRepository界面通常是浪费时间.如果我将基本的CRUD操作放在我的IRepository接口中,那么如何处理数据呢像审计数据呢?

  9. c# – MVVM中Model和ViewModel的澄清和命名约定

    我将城市模型作为POCO,然后对于城市列表,我将创建一个具有可观察的CityModel集合的Cityviewmodel.但那又怎样?我应该将Cityviewmodel作为CountryModel的一部分吗?也许是这样,有人可以澄清一下.这是我更加困惑的地方,因为我创建了一个具有属性Name,Location和List类型属性的CountryModel,但是我如何在MVVM中正确表示这一点?

  10. java – Spring MVC:服务层应该返回特定于DTO的操作吗?

    在我的SpringMVC应用程序中,我在表示层中使用DTO,以便将域模型封装在服务层中.DTO被用作弹簧形式的背衬物体.因此我的服务看起来像这样:服务层将翻译DTO–>域对象并完成剩下的工作.现在我的问题是,当我想从服务中检索DTO来执行更新或显示我似乎无法找到更好的方法来执行它然后有多个方法进行查找返回不同的DTO类似...但是对于这种方法有些不对劲.也许服务不应该返回像EditUserRequ

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部