给课程:
public class Parent
{
public int id {get; set;}
public int name {get; set;}
public virtual ICollection<Child> children {get; set;}
}
[Table("Child")]
public partial class Child
{
[Key]
public int id {get; set;}
public string name { get; set; }
[NotMapped]
public string nickName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和控制器代码:
List<Parent> parents = parentRepository.Get();
return Json(parents);
Run Code Online (Sandbox Code Playgroud)
它适用于LOCALHOST,但它不适用于实时服务器:
错误:Json序列化类型的对象时检测到循环引用
我做了一个搜索并找到了[ScriptIgnore]属性,所以我将模型更改为
using System.Web.Script.Serialization;
public class Parent
{
public int id {get; set;}
public int name {get; set;}
[ScriptIgnore] …Run Code Online (Sandbox Code Playgroud) 在这些情况下,帮助决定何时使用DTO以及何时使用实体的一般想法是什么?
我喜欢阅读传递实体的代码:
但是有关于DTO映射到实体的论点更安全,因为它是一个契约,实体可以改变为任何形式,并且DTO将保持不变.例如,类似于实体具有字段名称,并且DTO也具有字段名称.稍后,如果需求更改,数据库表发生更改,实体也可以更改,将名称更改为firstName和lastName.但是DTO仍然会有一个字段名,即firstName + lastName.
所以这里是使用DTO的优点列表:
我能想到的DTO的缺点是:
请分享你的想法..
谢谢 !
以下是来自不同地方的一些报价
亲:
将实体类重用为DTO似乎很麻烦.该类的公共API(包括公共方法的注释)不再明确定义它所呈现的合同的目的.该类最终将使用仅在将类用作DTO时才相关的方法,以及仅在将类用作实体时才相关的一些方法.关注点不会完全分开,事情会更紧密地结合在一起.对我而言,这是一个更重要的设计考虑因素,然后尝试节省创建的类文件的数量.
亲实体:
绝对不!!!
JPA实体映射到数据库,但它们不与数据库"绑定".如果数据库发生更改,则更改映射,而不是对象.对象保持不变.这就是重点!
当我继承我的控制器形式ODataControllervs 时,有人能解释我ApiController吗?
问题是由返回的结果ApiController可以使用OData查询过滤的事实引起的.
如果我应用于QueraybleAttribute控制器的方法,即使操作返回,也会处理查询IEnumerable.
但是如果没有此属性但是通过调用config.EnableQuerySupport(),仅在方法返回时才处理查询IQueryable.
我认为这不是一致的行为.WebAPI 文档和示例意味着控制器必须从ODataController中删除.我有点困惑.
任一ApiController accidentally和部分地支撑部分(至少$跳过,$滤波器和$顶部)的OData协议.或者这是设计的,我需要ODataController来完成ODataSupport.
真正的问题是我的服务暴露了DTO,而不是POCO.可能没有一对一的映射.需要将OData查询再次转换为DTO到针对POCO的EF查询.
现在只玩OData.我检索实体并将它们转换为DTO.不可否认,对于每个请求来说,从数据库中获取所有这些数据并不是非常有效,但仍然可以容忍实验.但是,如果它需要一些过滤的DTO子集,则定义上不需要将所有实体返回给客户端.
OData查询开始使用ApiController和Querayble属性开箱即用,但前面提到的不一致使我做错了.
如果我的问题很天真,我会倾向于DDD,所以道歉.我想我需要使用本地数据传输对象才能向用户显示数据,因为许多属性不属于任何实体/值对象.
但是,我不确定应该在域域层或应用程序服务层中实现此DTO的位置.DTO实现似乎是域的一部分,但这意味着当我在服务层中创建DTO集合并将其传递给表示层时,我必须在表示层中引用域层,这似乎是错误的.
使用DDD原则实现DTO的正确方法是什么?
简单的问题,我想知道任何人在那里放置的命名约定DTO/POCOS ....
我真的不想像匈牙利符号一样加前缀..我离开了!
但我的dtos命名与我的实际返回的对象名称冲突,虽然它们在不同的命名空间中仍然有点混乱..
我想知道任何人适用的命名约定
例如,我的客户对象称为客户
我做了一个映射到dto ...这是客户..我在想DtoCustomer ..
不确定
任何人 ?
我试图找出一种简单的方法来将DTO映射到没有样板代码的实体.虽然我在考虑使用dozer,但似乎需要大量的xml配置.有没有人看过使用DSL在纯Java中配置bean映射的推土机替代方案?
理想情况下,我希望找到一个受Guice做事方式启发的bean映射器.
我有一个MVC2 n层应用程序(DAL,域,服务,MVC Web)使用DDD方法(域驱动设计),具有带存储库的域模型.我的服务层使用请求/响应模式,其中Request和Response对象包含DTO(数据传输对象)以将数据从一个层封送到下一个层,并且映射通过AutoMapper的帮助完成.我的问题是:DTO通常采用什么样的形状?它既可以嵌套/复杂的 DTO,还是严格来说是平面投影?或者可能两者兼而有之?另外,拥有平面DTO与更复杂/嵌套DTO的主要原因是什么?
例如,假设我有一个域,如下所示:
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Company Company { get; set; }
}
public class Company
{
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有三种不同的方法可以对Response对象进行建模.
选项1 - DRYest选项:
public class GetEmployeeResponse …Run Code Online (Sandbox Code Playgroud) 我在使用EF和AutoMapper时遇到了一些问题.= /
例如 :
我有2个相关实体(客户和订单),他们是DTO课程:
class CustomerDTO
{
public string CustomerID {get;set;}
public string CustomerName {get;set;}
public IList< OrderDTO > Orders {get;set;}
}
class OrderDTO
{
public string OrderID {get;set;}
public string OrderDetails {get;set;}
public CustomerDTO Customers {get;set;}
}
//when mapping Entity to DTO the code works
Customers cust = getCustomer(id);
Mapper.CreateMap< Customers, CustomerDTO >();
Mapper.CreateMap< Orders, OrderDTO >();
CustomerDTO custDTO = Mapper.Map(cust);
//but when i try to map back from DTO to Entity it fails with AutoMapperMappingException.
Mapper.Reset();
Mapper.CreateMap< CustomerDTO …
Run Code Online (Sandbox Code Playgroud) 我正在研究POCO和DTO之间的差异(似乎POCO与行为有关(方法?))并且Martin Fowler在贫血领域模型上发现了这篇文章.
由于缺乏理解,我认为我已经创建了这些贫血领域模型之一.
在我的一个应用程序中,我将业务域实体定义为'dto'dll.他们有很多属性,包括getter和setter,而不是其他.我的业务逻辑代码(填充,计算)位于另一个"bll"dll中,我的数据访问代码位于"dal"dll中.我认为'最佳实践'.
所以通常我会像这样创建一个dto:
dto.BusinessObject bo = new dto.BusinessObject(...)
Run Code Online (Sandbox Code Playgroud)
并将其传递给bll层,如下所示:
bll.BusinessObject.Populate(bo);
Run Code Online (Sandbox Code Playgroud)
反过来,它执行一些逻辑并将其传递给dal层,如下所示:
dal.BusinessObject.Populate(bo);
Run Code Online (Sandbox Code Playgroud)
根据我的理解,为了使我的dto成为POCO,我需要将业务逻辑和行为(方法)作为对象的一部分.所以代替上面的代码更像是:
poco.BusinessObject bo = new poco.BusinessObject(...)
bo.Populate();
Run Code Online (Sandbox Code Playgroud)
即.我在对象上调用方法而不是将对象传递给方法.
我的问题是 - 我怎么能这样做,仍然保留关注点的'最佳实践'层次(单独的dll等...).不调用对象上的方法意味着必须在对象中定义方法?
请帮助我的困惑.
我找不到它们之间的区别.有谁知道如何区分它们?
dto ×10
c# ×4
automapper ×2
poco ×2
.net ×1
architecture ×1
asp.net-mvc ×1
bll ×1
dll ×1
dozer ×1
dto-mapping ×1
guice ×1
java ×1
jpa ×1
jsf ×1
json ×1
layer ×1
odata ×1
pojo ×1
terminology ×1