gpt4 book ai didi

c# - 如何在标记为内部的属性上使用 AutoMapper?

转载 作者:行者123 更新时间:2023-11-30 13:52:05 24 4
gpt4 key购买 nike

我有几个项目的解决方案。一个业务组件项目、一个 MVC Web 应用程序、一个 DTO 和 ViewModels 项目、一个业务组件单元测试项目和一个 MVC 单元测试项目。总而言之,并不少见。业务组件有一个对多个 WCF 端点的服务引用。在业务组件中,来自 WCF 端点的数据契约使用 AutoMapper 自动映射到 ViewModel 所需的数据中。我想解决的问题是自动生成的 WCF 代理中的数据契约 POCO 都是 PUBLIC,所以当我从我的 MVC web 应用程序引用我的业务组件时(实际上是通过 StructureMap 注入(inject)的,所以我可以在需要时使用模拟业务组件), 我可以从网络应用程序中访问 WCF POCO。由于其他几位开发人员将在 Web 应用程序上工作,我希望他们不要被诱惑直接使用 WCF POCO,而是通过业务组件。因此,我删除了业务组件中的服务引用,而是添加了一个调用带有/INTERNAL 标志的 SVCUTIL 的脚本,以便自动生成的类被标记为 INTERNAL 而不是公共(public)的。但是,现在 AutoMapper 不会映射到/从我的数据契约(Contract) POCO。

我找不到任何文档可以告诉我如何让 AutoMapper 使用 INTERNAL 属性,所以我从 github 中提取源代码并修改 TypeInfo.cs 以便它忽略字段并包含非公共(public)成员。现在我的解决方案可以完美运行,但是拥有我自己的自定义版本的 AutoMapper 感觉很老套。似乎应该有一种方法可以从 WCF 数据契约(Contract) POCO 进行映射,而无需将它们设为 PUBLIC。我错过了什么?

更改了 TypeInfo.cs

private IEnumerable<MemberInfo> GetAllPublicReadableMembers()
{
IEnumerable<Type> typesToScan = new[] { Type, Type.BaseType };

if (Type.IsInterface)
typesToScan = typesToScan.Concat(Type.GetInterfaces());

return typesToScan
.Where(x => x != null)
.SelectMany(x => x.FindMembers(
MemberTypes.Property, //changed this
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, //and this
(m, f) => m is FieldInfo ||
m is PropertyInfo && ((PropertyInfo)m).CanRead && !((PropertyInfo)m).GetIndexParameters().Any(),
null)
);
}

最佳答案

只需在初始化方法中设置配置对象的 ShouldMapProperty 属性即可。

这是一个使用静态 API 的示例,但是,您应该能够通过使用非静态 API 以类似的方式实现相同的目的。

Mapper.Initialize(i =>
{
i.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;
i.CreateMap<Source, Target>();
});

如果您使用配置文件,则必须将其放入构造函数中:

public class MyProfile : Profile
{
public MyProfile()
{
ShouldMapProperty = arg => arg.GetMethod.IsPublic || arg.GetMethod.IsAssembly;

// The mappings here.
}
}

关于c# - 如何在标记为内部的属性上使用 AutoMapper?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3208057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com