ProjectingwithContextualValuesinAutoMapper我目前正在评估AutoMapper是否对我们的项目有益。我正在使用ASP.NETWebAPI开发RESTfulWebAPI,我必须返回的其中一件事是带有链接的资源。考虑这个简化的示例,具有以下域对象:publicclassCustomer{publicstringName{get;放;我需要将它映射到一个资源对象,有点像DTO,但为了REST的方便添加了属性。下面是我的资源对象的样子:publicclassCustomerResource{publicstringName{get;放;}公共词典链接{get;放;}}Links属性需要包含指向相关资源的链接。现在,我可以使用以下方法构建它们:{controller="Customers",name=customer.Name})}}}varcustomers=Repository.GetAll();返回customers.Select(map);}...但这很乏味,我有很多嵌套资源等。等等。我看到的问题是我无法使用AutoMapper,因为它不允许我在投影期间提供某些范围限定为执行映射操作的点的内容。在这种情况下,ApiController的Url属性提供了我需要为我创建链接的UrlHelper实例,但可能还有其他情况。你会如何解决这个难题?PS我专门为这个问题输入了这段代码,它可以在你的脑海中编译,但在你最喜欢的IDE中可能会失败。这不是一个很好的解决方案,但在阅读文档之后,似乎没有一个......我们目前通过将元组映射到TDataTransfer来抛出上下文内容。因此,在您的情况下,您是Mapper.CreateMap,CustomerResource>。不漂亮,但它有效。我会考虑使用自定义类型转换器。类型转换器可以通过IOC容器注入上下文信息。或者,由于转换器是在配置时实例化的,它可以引用一个工厂,该工厂将在每次运行类型转换器时返回上下文信息。简单的例子你可以定义一个接口来获取当前的“上下文”(意思取决于你在做什么以及你如何实现这些东西,所以对于这个例子我将只使用当前的HttpContext来访问Session,Server,Items等...):公共接口IContextFactory{HttpContextGetContext();}简单实现:publicclassWebContextFactory:IContextFactory{publicHttpContextGetContext(){returnHttpContext.Current;您的自定义类型转换器可以从IOC容器中获取IContextFactory的实例,并且每次运行映射时,您都可以调用GetContext()来获取当前请求的上下文。访问Url属性UrlHelper来自附加到当前控制器上下文的Request对象。不幸的是,这在HttpContext中不可用。但是,您可以覆盖ApiController上的Initialize方法并将controllerContext存储在HttpContext.Items集合中:控制器上下文;base.Initialize(controllerContext);然后,您可以从当前的HttpContext访问它:varhelper=((HttpControllerContext)HttpContext.Current.Items["controllerContext"]).Request.GetUrlHelper();我不确定这是最佳解决方案,但它可以在自定义类型映射器中获取UrlHelper实例。以上就是C#学习教程:使用AutoMapper中的context值投影,分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
