想象一下,我有一个具有许多关系的对象,并且我只想返回列表中每个关系的一个属性。
public class MyComplexObject
{
public OtherObject1 OtherObject1 { get; set; }
public OtherObject2 OtherObject2 { get; set; }
public OtherObject3 OtherObject3 { get; set; }
public OtherObject4 OtherObject4 { get; set; }
public OtherObject5 OtherObject5 { get; set; }
public OtherObject7 OtherObject7 { get; set; }
public OtherObject8 OtherObject8 { get; set; }
public OtherObject9 OtherObject9 { get; set; }
public OtherObject10 OtherObject10 { get; set; }
}
Public class MyComplexObjectDto
{
public string PropertyOfOtherObject1 { get; set; }
public string PropertyOfOtherObject2 { get; set; }
public string PropertyOfOtherObject3 { get; set; }
public string PropertyOfOtherObject4 { get; set; }
public string PropertyOfOtherObject5 { get; set; }
public string PropertyOfOtherObject6 { get; set; }
public string PropertyOfOtherObject7 { get; set; }
public string PropertyOfOtherObject8 { get; set; }
public string PropertyOfOtherObject9 { get; set; }
public string PropertyOfOtherObject10 { get; set; }
}
约1º:我查询MyComplexObject的整个关系,并使用AutoMapper序列化我想要的数据。
public class MySercice: IApplicationService
{
private readonly IRespoitory _myComplexObjectRepository;
public MySercice(IRespoitory myComplexObjectRepository)
{
_myComplexObjectRepository = myComplexObjectRepository;
}
public async Task<List<MyComplexObjectDto>> GetMyComplexObject()
{
var objList = _myComplexObjectRepository.GetListAsync()
return ObjectMapper.Map<List<MyComplexObject>, List<MyComplexObjectDto>>(obj);
}
}
约2º:我做了一个林克。选择query,只从存储库中获取我想要的数据。
public class MyComplexObjectRepository: IRespository
{
private Context MyContext;
public MyComplexObjectRepository(Context myContext)
{
MyContext = myContext;
}
public Task<List<MyComplexObjectDto>> GetSerializedObjectList()
{
return myContext.MyComplexObject.Select( data => new MyComplexObjectDto {
PropertyOfOtherObject1 = data.OdetherObject1.FirstOrDefault( some complex value).value,
PropertyOfOtherObject2 = data.OdetherObject2.AnotherRelationship.AnthotherValue,
PropertyOfOtherObject3 = data.OdetherObject3.Sum( another complex value).ToString(),
PropertyOfOtherObject4 = data.OdetherObject4.someOtherValue,
PropertyOfOtherObject5 = data.OdetherObject5.AnotherObject.Value,
PropertyOfOtherObject6 = data.OdetherObject6,
PropertyOfOtherObject7 = data.OdetherObject7,
PropertyOfOtherObject8 = data.OdetherObject8, // This query can get very complex //
PropertyOfOtherObject9 = data.OdetherObject9,
PropertyOfOtherObject10 = data.OdetherObject10
});
}
}
对DDD和Performace的思考,我正在努力找出什么是应用程序的最佳选择。合同层永远不应该看到域层存储库不应该看到应用程序。合同。
我应该返回所有相关的数据(它可以是一个非常巨大的关系链(并在应用层中序列化这个对象的孔列表吗?
我应该将MyComplexObjectDto作为视图模型并将其存储在域层中吗?如果是,我如何重新注册IApplicationService?我应该把另一个dto装箱,然后";重复";应用程序中的此类。合同?
我希望我能表达我正在处理的问题是什么
- 从数据库中获取复杂对象的所有数据,并将所有数据传输到DTO并返回。我不建议这样做,您可以在ApplicationService中为每个用例创建一个方法,并根据用例的需要返回信息
- 从数据库中获取复杂对象的所有数据,并将相关数据传输到DTO并返回。这通常是一个很好的方法,但您应该非常小心从数据库中提取的数据的大小。例如,考虑ABP文档模块:
如您所知,ABP文档模块允许您读取文档,因此文档的内容会保存在数据库中并定期更新。无论如何,内容可能是巨大的,在每个DB查询中调用它都会导致性能问题。不需要内容,特别是在我们将文档显示为列表的部分,为此,我们在域层中创建了以下类:
https://github.com/abpframework/abp/blob/dev/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentWithoutContent.cs
如果在一个用例中不需要内容,我们在从数据库中提取数据的同时返回这个带有select的对象。https://github.com/abpframework/abp/blob/3fa526c4a124baa27f314c0c02af5949a1ce9245/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs#L203-L216
您不应该将DTO对象放在域或基础结构层中。有关更多信息,您可以阅读《实现领域驱动设计》一书=>https://abp.io/books/implementing-domain-driven-design