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 ドメイン オブジェクトを装飾することも考えましたが、やめました。プロビジョニング データを 2 つの異なる方法で表現したい場合はどうでしょうか。ドメイン オブジェクト自体をモデルとして使用する場合、これは不可能です。

他にどのようなオプションを検討する必要がありますか? 拡張メソッドは私の最後の選択肢です。特に、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 に答える