我应该如何将域对象的属性转移到其模型对应物?

时间:2012-10-30 17:24:25

标签: c# asp.net-mvc model

我们目前使用扩展方法来提供此功能,但我不禁感到有一个更清洁的解决方案。我玩过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中做相对繁重的工作时。

1 个答案:

答案 0 :(得分: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);