C# AutoMapper没有';使用Caliburn.Micro时,在设计时不工作 背景

C# AutoMapper没有';使用Caliburn.Micro时,在设计时不工作 背景,c#,automapper,caliburn.micro,design-time,C#,Automapper,Caliburn.micro,Design Time,我正在使用WPF和Caliburn.Micro为现有CLI应用程序构建用户界面。由于提供了大量DTO对象,我使用AutoMapper将数据传递给支持PropertyChanged通知的模型(使用Caliburn.Micro中的PropertyChangedBase) 我在方法内部设置AutoMapper,如下所示: Mapper.Initialize( config => config.CreateMap<ModelA, ModelB>() ); 当您更改ViewMo

我正在使用WPF和Caliburn.Micro为现有CLI应用程序构建用户界面。由于提供了大量DTO对象,我使用AutoMapper将数据传递给支持PropertyChanged通知的模型(使用Caliburn.Micro中的PropertyChangedBase)

我在方法内部设置AutoMapper,如下所示:

Mapper.Initialize(
    config => config.CreateMap<ModelA, ModelB>()
);
当您更改ViewModel中的任何值时,更改不会投影到设计器中,并且在您最后运行应用程序后,设计器会抛出错误(图像)并停止渲染,但一切都在运行时工作

形象

如何复制
  • 克隆存储库
  • 打开解决方案
  • 在设计器中打开视图/ShellView.xaml
  • 此时,设计师应该可以很好地工作,并在StackPanel中显示3个项目
  • 打开ViewModels/ShellViewModel.cs
  • 对源数组进行任何更改(更改名称、删除或添加项)
  • 运行应用程序时,您应该会看到所做的更改
  • 返回设计器查看视图/ShellView.xaml
  • 设计器将在第10行显示错误:“未映射的成员已找到…”

  • 我还没有完全解决设计时的问题,但是切换到基于实例的AutoMapper配置解决了这个异常

    protected override void Configure() {
        container = new SimpleContainer();
        container.Singleton<IWindowManager, WindowManager>();
        container.Singleton<IEventAggregator, EventAggregator>();
        container.PerRequest<IShell, ShellViewModel>();
    
        MapperConfiguration config = new MapperConfiguration(cfg => {
            cfg.CreateMap<Core.ProjectDto, Models.Panel.Project>();
        });
    
        container.RegisterInstance(
            typeof(IMapper),
            "automapper",
            config.CreateMapper()
        );
    }
    
    受保护的覆盖无效配置(){
    容器=新的SimpleContainer();
    container.Singleton();
    container.Singleton();
    container.PerRequest();
    MapperConfiguration配置=新的MapperConfiguration(cfg=>{
    CreateMap();
    });
    容器.RegisterInstance(
    类型(IMapper),
    “汽车制造商”,
    config.CreateMapper()
    );
    }
    
    这是因为AM未初始化。在这种情况下,CreateMissingTypeMaps的默认值为true,因此它为您创建了一个映射,但该默认映射无法工作,因为无法映射IsNotifying。感谢您的评论,这实际上是有意义的。你知道我应该在哪里初始化AutoMapper,这样它就可以在设计时工作了吗?我曾尝试在方法内部初始化它,但没有成功。我不知道这一点,但您可以做的是转移到基于实例的API。然后您可以注入IMapper,或者使用Lazy手动执行。
    xmlns:vm="clr-namespace:CaliburnAutoMapperBug.ViewModels"
    xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro.Platform"
    mc:Ignorable="d"
    d:DataContext="{d:DesignInstance Type=vm:ShellViewModel, IsDesignTimeCreatable=True}"
    cal:Bind.AtDesignTime="True">
    
    protected override void Configure() {
        container = new SimpleContainer();
        container.Singleton<IWindowManager, WindowManager>();
        container.Singleton<IEventAggregator, EventAggregator>();
        container.PerRequest<IShell, ShellViewModel>();
    
        MapperConfiguration config = new MapperConfiguration(cfg => {
            cfg.CreateMap<Core.ProjectDto, Models.Panel.Project>();
        });
    
        container.RegisterInstance(
            typeof(IMapper),
            "automapper",
            config.CreateMapper()
        );
    }