AutoMapper,数据集作为配置文件中的参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AutoMapper,数据集作为配置文件中的参数相关的知识,希望对你有一定的参考价值。

使用AutoMapper时遇到一些问题。我到处搜索,但要么我不理解解决方案(当没有提供代码时)或者它不适用于我的情况。

我有我的个人资料:

public class MyCustomProfile : Profile
{
    public MyCustomProfile()
    {
        CreateMap<DTO.Person, MyDataSet.PersonRow>();
    }
}

我有我的方法:

public static void TestAutoMapper(DTO.Person p)
{
    if (Mapper.Instance == null)
    {
        Mapper.Initialize(cfg => cfg.AddProfile<MyCustomProfile>());
    }

    MyDataSet.PersonRow pr = Mapper.Map<MyDataSet.PersonRow>(p);
}

但我的问题是:我需要添加我的个人资料.ConstructUsing(p => dts.get_XYdataset().Person.NewPersonRow());,其中dtsMyDataSet的一个实例。

而且我还需要MyDataSet dts方法中的TestAutoMapper(DTO.Person p)实例来保存结果MyDataSet.PersonRow pr如下:

dts.get_XYdataset().Person.AddPersonRow(pr)

但我不知道该怎么办。如果我把所有内容都放在TestAutoMapper()方法中,它会很好用,但当然它不干净,我想通过创建一个配置文件并在初始化映射器时调用它来分离逻辑。

编辑

所以我修改了我的TestAutoMapper()方法,如下所示:

public static void TestAutoMapper(DTO.Person p)
{
    if (Mapper.Instance == null)
    {
        Mapper.Initialize(cfg => cfg.AddProfile<MyCustomProfile>());
    }

    using (MyDataSet dts = new MyDataSet())
    {
        MyDataSet.PersonRow pr = Mapper.Map<MyDataset.PersonRow>(p, opt => opt.Items["Dataset"] = dts);
        dts.get_XYdataset().Person.AddPersonRow(pr);
    }

然后我尝试关注自定义解析器的迷你tuto并实现了这个类:

public class CustomResolver: IMemberValueResolver<object, object, MyDataSet, MyDataSet>
{
    public MyDataSet Resolve(object source, object destination, MyDataSet dts, MyDataSet dts2, ResolutionContext context)
    {
        if (dts != null)
        {
            return dts;
        }
        else if (dts2 != null)
        {
            return dts2;
        }
        return new MyDataSet();
    }
}

但我认为这没关系。但好吧,无论如何我都没有尝试过。但现在我在CreateMap<DTO.Person, MyDataSet.PersonRow>()声明中被困在我的配置文件构造函数中。如何在Options.Items["Dataset"]获得.ConstructUsing()

示例显示有关成员的CustomResolver但是如何指定构造函数? 如果我可以这样做,那将是如此完美: CreateMap<DTO.Person, MyDataSet.PersonRow>() .ConstructUsing(Options.Items["Dataset"].get_XYdataset().Person.NewPersonRow());

我知道我需要帮助可能很愚蠢,但即使阅读文档我也真的不明白。

你怎么看 ?

谢谢,

Hellcat8

答案

好的,最后它适用于此代码:

public static class PersonManager
{
    private static MapperConfiguration _config;
    private static IMapper _mapper;

    public static void TestAutoMapper(DTO.Person p)
    {
        if (_config == null)
        {
            _config = new MapperConfiguration(cfg => cfg.AddProfile<MyCustomProfile>());
        }

        if (_mapper == null)
        {
             _mapper = _config.CreateMapper();
        }

        using (MyDataSet dts = new MyDataSet())
        {
            XYdataset.PersonRow pr = _mapper.Map<XYdataset.PersonRow>(p, opt => opt.Items["Dataset"] = dts);
            dts.get_XYdataset().Person.AddPersonRow(pr);
        }
     }
 }

我有我的个人资料:

public class MyCustomProfile : Profile
{
    public MyCustomProfile()
    {
        CreateMap<DTO.Person, XYdataset.PersonRow>()  
             .ConstructUsing((source, resolutionContext) =>  
             (resolutionContext.Items["Dataset"] as MyDataSet)  
             .(get_XYdataset().Person.NewPersonRow());
    }
}

以上是关于AutoMapper,数据集作为配置文件中的参数的主要内容,如果未能解决你的问题,请参考以下文章

想找基于J2EE的网站设计找我们代做

想找基于J2EE的网站设计找我们代做

如何使用automapper映射与多个表的数据集

如何使用automapper映射与多个表的数据集

AutoMapper - 强类型数据集

AutoMapper小技巧:通过特性配置读取缓存