Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何传输域对象';其模型对应物的属性?_C#_Asp.net Mvc_Model - Fatal编程技术网

C# 如何传输域对象';其模型对应物的属性?

C# 如何传输域对象';其模型对应物的属性?,c#,asp.net-mvc,model,C#,Asp.net Mvc,Model,我们目前使用扩展方法来提供此功能,但我忍不住觉得有一个更干净的解决方案。我和AutoMapper打过交道,但我不太明白它是如何解决复杂情况下的问题的。对于一个简单的1:1来说,它是可行的,但如果需要对数据进行任何修改,这似乎是一种失望 所以,我有这样的想法: public static class ProvisioningExtensions { // Convert ProvisioningServicesProxy.Provisioning to ProvisioningDetail

我们目前使用扩展方法来提供此功能,但我忍不住觉得有一个更干净的解决方案。我和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域对象,使其可以用来代替模型,但最终决定不这么做。如果我想用两种不同的方式来表示供应数据会怎么样?如果我使用域对象本身作为模型,这是不可能的


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

在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;
        }
    }
public类createMomentCommandTomomentoConverter:ITypeConverter
{
公共时间转换(ResolutionContext上下文)
{
var source=(createMomentCommand)context.SourceValue;
var momento=new momento{Username=source.Username};
返回时刻;
}
}
使用AutoMapper初始化客户类型转换器

    /// <summary>
    /// Configures the aut do mapper.
    /// </summary>
    public static void ConfigureAutoMapper()
    {
        AutoMapper.Mapper.Initialize(c=> c.CreateMap<CreateMomentoCommand, Momento>().ConvertUsing(new CreateMomentoCommandToMomentoConverter()));
    }
//
///配置aut do映射器。
/// 
公共静态无效配置自动映射()
{
初始化(c=>c.CreateMap().ConvertUsing(新的createMomentCommandTomomentoConverter());
}
最后,绘制地图

Mapper.Map<CreateMomentoCommand, Momento>(command);
Mapper.Map(命令);