Interface 依赖注入-与数据传输对象(DTO)一起使用?
考虑下面的代码(已简化)。我有一个服务类,它返回特定DTO对象的列表,每个对象都实现自己的特定接口。在实际的代码中,当我使用遗留代码时,通过迭代数据集来填充这些数据 问题:Interface 依赖注入-与数据传输对象(DTO)一起使用?,interface,dependency-injection,dto,anti-patterns,service-locator,Interface,Dependency Injection,Dto,Anti Patterns,Service Locator,考虑下面的代码(已简化)。我有一个服务类,它返回特定DTO对象的列表,每个对象都实现自己的特定接口。在实际的代码中,当我使用遗留代码时,通过迭代数据集来填充这些数据 问题: 我们如何创建/使用DTO而不更新它们或使用服务定位器反模式?在组合根目录中组合一个空DTO对象并通过构造函数将其注入服务类没有多大意义,因为在填充列表时,我实际上将DTO用作临时排序变量 在代码中,您可以看到我更新DTO的示例。但这感觉不太好 比我一开始就让DTO不实现接口要好。那么,他们是否应该实现接口,从而不将DI与DT
公共类服务:iSeries设备
{
公共IList GetDTOs()
{
...
List dtos=新列表();
foreach(c在d中)
{
DTO DTO=新的DTO();
dto.x=c.x;
dto.y=c.y;
dto.z=c.z;
添加(dto);
}
返回DTO;
}
}
对于我来说,在DTO中使用任何DI都没有多大意义。我可能会使用工厂模式来获取模型对象的DTO
DTO不需要容器管理其生命周期;我只想
新建它们。不要过度设计。我认为DTO不应该实现接口,因为它们不太可能实现会改变的行为
他们也不应该被注射。并非所有对象都应为空。我认为这是对new的一个恰当的调用:创建对象,使用它,让它超出范围并进行GC。看一看。我同意@duffymo,我不会使用DTO的接口。AutoMapper是一个基于约定的对象到对象映射器,它将为您创建和填充DTO。如果没有其他东西,它将节省你大量的打字。我已经完成了编写DTO与相关打字错误之间的转换例程的练习。我要是早点找到汽车制造商就好了。在您的示例中(我名义上创建了Order类型的“from”对象):
公共类服务:iSeries设备
{
公共IList GetDTOs()
{
...
Mapper.CreateMap();//将贴图创建移动到启动例程
var dtos=新列表();
foreach(c在d中)
{
Add(Mapper.Map(c));
}
返回DTO;
}
}
或者使用LINQ
public class Services : IServices
{
public IList<DTO> GetDTOs()
{
...
Mapper.CreateMap<Order, DTO>(); // move map creation to startup routine
return d.Select(c => Mapper.Map<Order, DTO>(c)).ToList();
}
}
公共类服务:iSeries设备
{
公共IList GetDTOs()
{
...
Mapper.CreateMap();//将贴图创建移动到启动例程
返回d.Select(c=>Mapper.Map(c)).ToList();
}
}
related:重复,回答有趣:+1个好答案。您应该使用AM内置的对映射数组的支持,也就是说,您可以Mapper.Map(xs)
。不确定IList是否是a)必需的b)AM支持的OOTB,但如果您这样做了,obv ToList将执行必需的操作
public class Services : IServices
{
public IList<DTO> GetDTOs()
{
...
Mapper.CreateMap<Order, DTO>(); // move map creation to startup routine
var dtos = new List<DTO>();
foreach (c in d)
{
dtos.Add( Mapper.Map<Order, DTO>(c));
}
return dtos;
}
}
public class Services : IServices
{
public IList<DTO> GetDTOs()
{
...
Mapper.CreateMap<Order, DTO>(); // move map creation to startup routine
return d.Select(c => Mapper.Map<Order, DTO>(c)).ToList();
}
}