我有一组共享通用DTO模型的WCF Web服务.
问题是,当我在Visual Studio 2010中添加服务引用时,为每个Web服务生成的代理都有自己的命名空间(解决方案的内部),这意味着我在每个服务引用上基本上都有重复的DTO.
有没有一种干净的方法可以克服这个并分享dto,而不是在整个服务组中创建一个外观?
干杯.
在一个普通的 DDD 项目中,我希望从存储库中检索到的实体作为 DTO 从域层发送到应用层。
CQRS 存在的原因之一似乎是应用层所需的查询(主要是读取操作)与域层所需的查询不同。所以看起来即使是同一个对象的查询结果在不同层之间也可能不同。
在我的域层中,我已经将查询结果映射到域实体中。我对一些 CQRS 示例将查询结果直接映射到 DTO 跳过它们的匹配实体感到困惑。
假设一个数据库返回:
{"person": {
"id:": 5323423,
"name": "John",
"family_name": "Smith"
...
}}
Run Code Online (Sandbox Code Playgroud)
但是实体布局将family name映射为surname:
class Person
{
Identity id;
String name;
String surname;
}
Run Code Online (Sandbox Code Playgroud)
如果在我看到的某些 CQRS 示例中发生这种情况,则提取的 DTO 看起来会有所不同,从而在将实体与其 DTO 进行匹配时会导致冲突。这些冲突如何解决?在我看来,任何 DTO(与实体相关)都应始终从其实体生成。然而,在这种情况下,在应用层中执行不同类型查询的自由会丢失。
我正在使用Entity Framework Code First并尝试从我的实体类映射到我的DTO类.但我很难搞清楚如何编写Selector.
在这个小例子中,我创建了一个Person类和一个Address类.
在DTO类中,我创建了一个Selector,它从我的Entity映射到我的DTO,但是不能在PersonDto.Selector中使用AddressDto.Selector吗?
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
public int Id { get; set; }
public string Street { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试将其映射到DTO类.
public class PersonDto
{
public static Expression<Func<Person, PersonDto>> Selector =
entity => new PersonDto
{
Id = entity.Id,
Name = entity.Name,
Address = ??? AddressDTO.Selector
};
public int …
Run Code Online (Sandbox Code Playgroud) 在Ward的文章" The Breeze Server:Have it your way "中:
典型的业务应用程序至少有200个域模型类型.我通过网络发送的数据形状的90%以上与我的业务模型中的实体形状相同.
...
当客户端实体的形状与服务器端业务实体的形状不一致时,我可能会针对该特定情况切换到DTO.
对于我们的应用而言,这可以直接敲击头部,但是为DTO 切换一些实体的最佳方法是什么?
例如,我们的用户实体包含不应向客户端公开的敏感属性.它还具有从其他系统中提取并返回到客户端的相关数据,理想情况下,这些数据应该是客户端User对象的额外属性.用户似乎是切换到DTO的理想候选者.
如果用户是一个孤立的实体,这可能会更容易,但问题是用户基本上在模型中的任何地方被引用.例如,几乎每个实体都有一个CreatedBy属性.
有没有办法在模型中的任何位置切换用户DTO的用户实体?对于模型中引用用户的所有其他实体,我们仍然需要能够在扩展其用户属性的情况下加载它们,在这些用户属性上查询它们,并通过对这些用户属性的更改来保存它们.
除了构建与实体模型95%相同的大型DTO模型之外,我不确定如何做到这一点,并且在它们之间有一些映射代码/框架.但是,正如沃德在这篇文章中所说的那样,"我不喜欢每种类型的DTO;这种过度杀伤可能会破坏生产力."
我正在使用OpenJPA和QueryDSL,我试图通过使用QueryDSL的bean投影功能来避免操作Tuple对象.我有例如这两个实体,具有@ManyToOne关系.
@Entity
public class Folder {
private Long id;
private String name;
private String path;
@ManyToOne
@JoinColumn(name = "FK_FILE_ID")
private File file;
}
@Entity
public class File {
private Long id;
private String fileName;
}
Run Code Online (Sandbox Code Playgroud)
当我执行此查询时:
List<Folder> listFolders = query.from(folder)
.list(Projections.bean(Folder.class, folder.name, folder.file.fileName));
Run Code Online (Sandbox Code Playgroud)
我有一个错误,说Folder对象不包含fileName属性.
我理解QueryDSL正在做什么,因为它是一个简单的"平面"投影,但我想知道是否可以用查询找到的值填充我的folder.file对象的fileName属性.
注意:我知道我可以为我的Folder类定义构造函数并使用此方法:
query.list(ConstructorExpression.create(Folder.class, folder.name,
folder.file.fileName));
Run Code Online (Sandbox Code Playgroud)
但是如果可能的话我想避免这种情况,因为它迫使我在我的投影中为我想要的字段的N组合定义N构造函数.
在 asp.net (webapi+mvc) 项目中,我有许多 dto 作为我的 BLL 的公共接口。此外,我的大多数视图模型都与适当的 dtos 相同。
聪明的书告诉我们,我们必须分离这种模型,但在项目中我看不到这种解决方案的好处。只有数百个无用的代码,其中包含许多愚蠢的错误。
那么 - 在可能的情况下使用 DTO 作为视图模型是否正确?该解决方案的正面和负面影响是什么?
试图重构一些代码.我看到一些创建DTO对象的类正在服务层中传递,后来由@RestController返回.据我所知,最好只在控制器中构建数据传输对象并将它们传递给视图,尤其是当我们使用WrapperDTO<T>
get和set值之类的东西时.当我们使用复杂对象或简单数据类型构建WrapperDTO时,可能存在差异.所有的oppinions将非常感激.
我想在参数中传递Dto并在spring jdbc中调用存储过程.这有可能,这样做吗?
我想用patometer中的dto调用存储过程而不是设置参数?因为我有大量的参数.
注意:我的问题是在 .NET/C# 项目中使用 DTO、ViewModel。
我知道 DTO、ViewModel、模型。他们有特定的目的。我们使用 DTO 传输数据,使用 ViewModel 向最终用户显示数据。但是我对将它们全部一起使用感到困惑。我做了很多谷歌搜索,但没有找到如何一起使用它们的完整教程。
我不确定它们是否可以一起使用,或者它们必须用于特定目的,例如对于常规 MVC,我们可以使用 ViewModel,对于 WebAPI,我们将使用 DTO。
任何人都可以解释使用它们的方式,或者任何将它们集中在一起使用的链接表示赞赏。
dto ×10
c# ×3
.net ×2
asp.net-mvc ×2
viewmodel ×2
breeze ×1
cqrs ×1
entity ×1
java ×1
jpa ×1
mysql ×1
openjpa ×1
projection ×1
querydsl ×1
spring ×1
spring-jdbc ×1
spring-mvc ×1
wcf ×1
web-services ×1