2

我们目前使用扩展方法来提供此功能,但我不禁觉得有一个更清洁的解决方案。我玩过 AutoMapper,但我不太明白它是如何在复杂情况下解决问题的。对于简单的 1:1 来说,它可以工作,但如果需要对数据进行任何修改——这似乎令人失望。

所以,我有类似的东西:

public static class ProvisioningExtensions
{
    // Convert ProvisioningServicesProxy.Provisioning to ProvisioningDetailsModel.
    public static ProvisioningDetailsModel ToProvisioningDetailsModel(this Provisioning provisioning)
    {
        var provisioningDetailsModel = new ProvisioningDetailsModel
        {
            ID = provisioning.ID,
            TaskDeviceID = provisioning.TaskDevice.ID,
            ServiceGroupID = provisioning.ServiceGroup.ID,
            ServiceID = provisioning.Service.ID,
            PatchSchedules = provisioning.PatchSchedules.Select(ps => ps.ToPatchScheduleDetailsModel()).ToList()
        };

        return provisioningDetailsModel;
    }

    // Convert ProvisioningDetailsModel to ProvisioningServicesProxy.PatchSchedule.
    public static Provisioning ToProvisioning(this ProvisioningDetailsModel provisioningDetailsModel)
    {
        WorkflowManager workflowManager = new WorkflowManager();
        ProvisioningManager provisioningManager = new ProvisioningManager();

        TaskDevice taskDevice = workflowManager.GetTaskDeviceByID(provisioningDetailsModel.TaskDeviceID);
        Service service = provisioningManager.GetServiceByID(provisioningDetailsModel.ServiceID);
        ServiceGroup serviceGroup = provisioningManager.GetServiceGroupByID(provisioningDetailsModel.ServiceGroupID);

        var provisioning = new Provisioning
        {
            ID = provisioningDetailsModel.ID,
            TaskDevice = taskDevice,
            ServiceGroup = serviceGroup,
            Service = service,
            PatchSchedules = provisioningDetailsModel.PatchSchedules.Select(ps => ps.ToPatchSchedule()).ToArray()
        };

        return provisioning;
    }
}

ProvisioningDetailsModel 是一个只包含模型属性的类。没什么特别的。

我考虑过装饰 Provisioning 域对象,以便可以使用它来代替模型,但决定不这样做。如果我想以两种不同的方式表示供应数据怎么办——如果我使用域对象本身作为我的模型,这将是不可能的。

我应该考虑哪些其他选择?扩展方法将是我最后的选择——尤其是当我必须在 ToProvisioning 中做相对繁重的工作时。

4

1 回答 1

2

在 AutoMapper 中,您可以创建类型自定义转换器。这是通过实现 ITypeConverter<> 接口来完成的。

   public class CreateMomentoCommandToMomentoConverter : ITypeConverter<CreateMomentoCommand, Momento>
    {
        public Momento Convert(ResolutionContext context)
        {
            var source = (CreateMomentoCommand) context.SourceValue;
            var momento = new Momento {Username = source.Username};

            return momento;
        }
    }

使用 AutoMapper 初始化客户类型转换器

    /// <summary>
    /// Configures the aut do mapper.
    /// </summary>
    public static void ConfigureAutoMapper()
    {
        AutoMapper.Mapper.Initialize(c=> c.CreateMap<CreateMomentoCommand, Momento>().ConvertUsing(new CreateMomentoCommandToMomentoConverter()));
    }

最后映射它。

Mapper.Map<CreateMomentoCommand, Momento>(command);
于 2012-10-30T17:28:52.450 回答