标签: dto

Json在序列化类型的对象时检测到循环引用

给课程:

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)

c# json dto

23
推荐指数
1
解决办法
5万
查看次数

JPA实体和/与DTO

在这些情况下,帮助决定何时使用DTO以及何时使用实体的一般想法是什么?

  1. UI /服务器端java调用服务.它应该获得/发送实体或DTO吗?
  2. 调用服务的Web服务.服务是否应接受实体或DTO?

我喜欢阅读传递实体的代码:

  1. 更简单的传递,不需要映射到DTO
  2. 不需要额外的课程
  3. 已经定义了与其他实体的关系,因此不需要将相关的DTO组合到一个DTO中
  4. 只是POJO

但是有关于DTO映射到实体的论点更安全,因为它是一个契约,实体可以改变为任何形式,并且DTO将保持不变.例如,类似于实体具有字段名称,并且DTO也具有字段名称.稍后,如果需求更改,数据库表发生更改,实体也可以更改,将名称更改为firstName和lastName.但是DTO仍然会有一个字段名,即firstName + lastName.

所以这里是使用DTO的优点列表:

  1. 从接受DTO的代码的角度向后兼容

我能想到的DTO的缺点是:

  1. 必须定义DTO类和映射(可能使用推土机)
  2. 程序员必须分析何时使用DTO和实体,我的意思是为每个方法传递DTO都是一团糟
  3. 将实体转换为DTO的开销,反之亦然
  4. 我仍然不确定如何映射它们的一对多关系.在JPA中我们可以懒惰地初始化它,但是当传入DTO时,我应该初始化这个与否.很快,DTO不能使用惰性初始化代理,只包含值.

请分享你的想法..

谢谢 !

以下是来自不同地方的一些报价

:

将实体类重用为DTO似乎很麻烦.该类的公共API(包括公共方法的注释)不再明确定义它所呈现的合同的目的.该类最终将使用仅在将类用作DTO时才相关的方法,以及仅在将类用作实体时才相关的一些方法.关注点不会完全分开,事情会更紧密地结合在一起.对我而言,这是一个更重要的设计考虑因素,然后尝试节省创建的类文件的数量.

亲实体:

绝对不!!!

JPA实体映射到数据库,但它们不与数据库"绑定".如果数据库发生更改,则更改映射,而不是对象.对象保持不变.这就是重点!

architecture jsf jpa dto

22
推荐指数
1
解决办法
8685
查看次数

暴露DTO时ApiController与ODataController

当我继承我的控制器形式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属性开箱即用,但前面提到的不一致使我做错了.

.net dto odata asp.net-web-api asp.net-apicontroller

22
推荐指数
1
解决办法
1万
查看次数

DDD - 应实施哪一层DTO

如果我的问题很天真,我会倾向于DDD,所以道歉.我想我需要使用本地数据传输对象才能向用户显示数据,因为许多属性不属于任何实体/值对象.

但是,我不确定应该在域域层或应用程序服务层中实现此DTO的位置.DTO实现似乎是域的一部分,但这意味着当我在服务层中创建DTO集合并将其传递给表示层时,我必须在表示层中引用域层,这似乎是错误的.

使用DDD原则实现DTO的正确方法是什么?

implementation domain-driven-design layer dto

22
推荐指数
4
解决办法
1万
查看次数

为DTO/POCOS添加前缀 - 命名约定?

简单的问题,我想知道任何人在那里放置的命名约定DTO/POCOS ....

我真的不想像匈牙利符号一样加前缀..我离开了!

但我的dtos命名与我的实际返回的对象名称冲突,虽然它们在不同的命名空间中仍然有点混乱..

我想知道任何人适用的命名约定

例如,我的客户对象称为客户

我做了一个映射到dto ...这是客户..我在想DtoCustomer ..

不确定

任何人 ?

c# naming-conventions poco dto

21
推荐指数
3
解决办法
7018
查看次数

推土机替代bean映射?

我试图找出一种简单的方法来将DTO映射到没有样板代码的实体.虽然我在考虑使用dozer,但似乎需要大量的xml配置.有没有人看过使用DSL在纯Java中配置bean映射的推土机替代方案?

理想情况下,我希望找到一个受Guice做事方式启发的bean映射器.

dto-mapping guice dto dozer

21
推荐指数
2
解决办法
3万
查看次数

DTO形状:扁平,复杂/嵌套,或两者的混合

我有一个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)

c# asp.net-mvc domain-driven-design dto automapper

21
推荐指数
1
解决办法
4738
查看次数

实体框架+ AutoMapper(实体到DTO和DTO到实体)

我在使用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)

c# entity-framework dto automapper

20
推荐指数
4
解决办法
4万
查看次数

POCO,DTO,DLL和贫血领域模型

我正在研究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等...).不调用对象上的方法意味着必须在对象中定义方法?

请帮助我的困惑.

dll data-access-layer poco dto bll

20
推荐指数
3
解决办法
5106
查看次数

20
推荐指数
6
解决办法
2万
查看次数