Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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# 替换静态自动映射API;替换配置文件中的映射方法_C#_Automapper - Fatal编程技术网

C# 替换静态自动映射API;替换配置文件中的映射方法

C# 替换静态自动映射API;替换配置文件中的映射方法,c#,automapper,C#,Automapper,我正在替换静态AutoMapper API: 所以,在我有一个档案之前像: public class DigitalResourceProfile : AutoMapper.Profile { protected override void Configure() { AutoMapper.Mapper.CreateMap<DTO, Domain>(); AutoMapper.Mapper.CreateMap<Domain, D

我正在替换静态AutoMapper API:

所以,在我有一个
档案之前
像:

public class DigitalResourceProfile : AutoMapper.Profile
{
    protected override void Configure()
    {
        AutoMapper.Mapper.CreateMap<DTO, Domain>();

        AutoMapper.Mapper.CreateMap<Domain, DTO>()
            .ForMember(dst => dst.Attachs, opts => opts.MapFrom(src => AutoMapper.Mapper.Map<List<AttachDomain>, List<AttachDTO>>(src.Attachs)))
            .ForMember(dst => dst.Timestamp, opts => opts.MapFrom(s => s.Timestamp.ToUniversalTime()));

        AutoMapper.Mapper.CreateMap<AttachDTO, AttachDomain>();

        AutoMapper.Mapper.CreateMap<AttachDomain, AttachDTO>()
            .ForMember(dst => dst.Timestamp, opts => opts.MapFrom(s => s.Timestamp.ToUniversalTime()));
    }
}
公共类DigitalResourceProfile:AutoMapper.Profile { 受保护的覆盖无效配置() { AutoMapper.Mapper.CreateMap(); AutoMapper.Mapper.CreateMap() .FormMember(dst=>dst.Attachs,opts=>opts.MapFrom(src=>AutoMapper.Mapper.Map(src.Attachs))) .ForMember(dst=>dst.Timestamp,opts=>opts.MapFrom(s=>s.Timestamp.ToUniversalTime()); AutoMapper.Mapper.CreateMap(); AutoMapper.Mapper.CreateMap() .ForMember(dst=>dst.Timestamp,opts=>opts.MapFrom(s=>s.Timestamp.ToUniversalTime()); } } 从现在起,此配置文件类如下所示:

public class DigitalResourceProfile : AutoMapper.Profile
{
    protected override void Configure()
    {
        this.CreateMap<DTO, Domain>();

        this.CreateMap<Domain, DTO>()
>>>>>>>>>>>>>>>>>.ForMember(dst => dst.Attachs, opts => opts.MapFrom(src => AutoMapper.Mapper.Map<List<AttachDomain>, List<AttachDTO>>(src.Attachs)))
            .ForMember(dst => dst.Timestamp, opts => opts.MapFrom(s => s.Timestamp.ToUniversalTime()));

        this.CreateMap<AttachDTO, AttachDomain>();

        this.CreateMap<AttachDomain, AttachDTO>()
            .ForMember(dst => dst.Timestamp, opts => opts.MapFrom(s => s.Timestamp.ToUniversalTime()));
    }
}
公共类DigitalResourceProfile:AutoMapper.Profile { 受保护的覆盖无效配置() { 这个.CreateMap(); 这个 >>>>>>>>>>>>>>>>>.FormMember(dst=>dst.Attachs,opts=>opts.MapFrom(src=>AutoMapper.Mapper.Map(src.Attachs))) .ForMember(dst=>dst.Timestamp,opts=>opts.MapFrom(s=>s.Timestamp.ToUniversalTime()); 这个.CreateMap(); 这个 .ForMember(dst=>dst.Timestamp,opts=>opts.MapFrom(s=>s.Timestamp.ToUniversalTime()); } } 但是,我不知道如何替换
.formmember(dst=>dst.Attachs,opts=>opts.MapFrom(src=>AutoMapper.Mapper.Map(src.Attachs))


有什么想法吗?

不使用静态API,您可以将映射引擎传递给概要文件构造函数

您将在下面找到一个使用Unity的单元测试

[TestClass]
public class UnitTest1
{
    public class TestA
    {
        public TestC valueA { get; set; }
    }
    public class TestB
    {
        public TestD valueB { get; set; }
    }

    public class TestC
    {
        public string value { get; set; }
    }
    public class TestD
    {
        public string value { get; set; }
    }

    private readonly IUnityContainer appContainer = new UnityContainer();

    public sealed class MappingConfiguration : Profile
    {
        private readonly IMappingEngine mappingEngine;

        // Inject mapping engine through constructor
        public MappingConfiguration(IMappingEngine mappingEngine)
            : base()
        {
            this.mappingEngine = mappingEngine;
        }

        protected override void Configure()
        {
            CreateMap<TestA, TestB>()
                .ForMember(dest => dest.valueB, o => o.ResolveUsing(src => 
                    this.mappingEngine.Mapper.Map<TestD>(src.valueA)));
            CreateMap<TestC, TestD>();
        }
    }

    [TestMethod]
    public void MappingTest()
    {
        // AutoMapper configuration
        var config = new MapperConfiguration(cfg =>
        {
            cfg.ConstructServicesUsing(type => appContainer.Resolve(type));
        });
        var mapper = config.CreateMapper();

        appContainer.RegisterInstance<IConfiguration>(config);
        appContainer.RegisterType<IMappingEngine, MappingEngine>(new InjectionConstructor(config, mapper));

        appContainer.Resolve<IConfiguration>().AddProfile(new MappingConfiguration(appContainer.Resolve<IMappingEngine>()));

        // Check config
        mapper.ConfigurationProvider.AssertConfigurationIsValid();

        var testIn = new TestA { valueA = new TestC { value = "This is a test" } };
        var result = mapper.Map<TestB>(testIn);
    }

}
[TestClass]
公共类UnitTest1
{
公共类遗嘱
{
public TestC valueA{get;set;}
}
公共类TestB
{
公共TestD valueB{get;set;}
}
公共类TestC
{
公共字符串值{get;set;}
}
公共类TestD
{
公共字符串值{get;set;}
}
私有只读IUnityContainer appContainer=new UnityContainer();
公共密封类映射配置:配置文件
{
专用只读IMappingEngine映射引擎;
//通过构造函数注入映射引擎
公共映射配置(IMappingEngine映射引擎)
:base()
{
this.mappingEngine=mappingEngine;
}
受保护的覆盖无效配置()
{
CreateMap()
.ForMember(dest=>dest.valueB,o=>o.ResolveUsing(src=>
this.mappingEngine.Mapper.Map(src.valueA));
CreateMap();
}
}
[测试方法]
公共void映射测试()
{
//自动映射配置
var config=new-MapperConfiguration(cfg=>
{
ConstructServicesUsing(type=>appContainer.Resolve(type));
});
var mapper=config.CreateMapper();
appContainer.RegisterInstance(配置);
RegisterType(新的InjectionConstructor(config,mapper));
appContainer.Resolve().AddProfile(新的映射配置(appContainer.Resolve());
//检查配置
mapper.ConfigurationProvider.AssertConfigurationsValid();
var testIn=newtesta{valueA=newtestc{value=“这是一个测试”};
var result=mapper.Map(testIn);
}
}

您是否找到了一种不使用静态API从概要文件调用Map()方法的方法?很遗憾,还没有。谢谢您的帮助。但是为什么要将配置和映射引擎添加到IOC容器中?我采用了类似的方法,但创建了这两个类的实例,然后将IMapper添加到IOC容器中。