Interface 依赖注入-与数据传输对象(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

考虑下面的代码(已简化)。我有一个服务类,它返回特定DTO对象的列表,每个对象都实现自己的特定接口。在实际的代码中,当我使用遗留代码时,通过迭代数据集来填充这些数据

问题:

  • 我们如何创建/使用DTO而不更新它们或使用服务定位器反模式?在组合根目录中组合一个空DTO对象并通过构造函数将其注入服务类没有多大意义,因为在填充列表时,我实际上将DTO用作临时排序变量

  • 在代码中,您可以看到我更新DTO的示例。但这感觉不太好 比我一开始就让DTO不实现接口要好。那么,他们是否应该实现接口,从而不将DI与DTO一起使用呢


  • 公共类服务: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();
         }
    }