如何为当前用户设置AutoMapper全局配置?

时间:2017-08-01 19:24:03

标签: c# inversion-of-control automapper

简介

我有一个Asp.Net MVC项目AutoMapperIOC StructureMap ),而且每件事都运作良好。

我宣布了一些AutoMapper Profiles并在IOC注册了它们,最后在某些类的承包商中使用IMappingEngine来使用AutoMapper

AutoMapper Version:   4.0.4
StructureMap Version: 4.2.0.402

问题:

我希望根据当前用户的时区声明为所有AutoMapper配置文件设置全局转换配置

  

此AutoMapper转换配置的规则:

     
      
  • 应该是所有AutoMapper配置文件的全局配置
  •   
  • 应该是项目中的某个位置,每次用户向我们发送请求时,我们都会通过用户时区声明进行设置
  •   
  • 不应该影响其他在线用户的AutoMapper配置(它不应该是对单个对象的设置   IOC中的AutoMapper)
  •   

我做了什么:

我在OnAuthorization继承的类的AuthorizeAttribute方法中编写以下配置,并在项目的Controller类中使用此属性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public sealed class Mcv5AuthorizeAttribute : AuthorizeAttribute
{  
    public Mcv5AuthorizeAttribute(): base(){}

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        var ct = filterContext.HttpContext;
        if (ct.Request.IsAuthenticated)
        {
            Mapper.Initialize(conf => conf.CreateMap<DateTime, string>().ConvertUsing(new MyDateTimeConverter(ct.User.GetUserTimezoneId())));

            // Other codes
        }
   }
}

我还想把上面的代码放在 Base Controller Controller Factory 中。

我的问题:

  • 考虑到项目中描述的IOC,剂量Mapper.Initialize也影响其他在线用户的AutoMapper配置?
  • 我应该如何编写上述AutoMapper转换配置以符合上述规则?
  • 哪个地方写得更好( Base Controller Controller Factory ,自定义 AuthorizeAttribute 或......)?

更新

我真的想要定义一些 custom type converter in AutoMapper 。您可以阅读它并查看ITypeConverter之类的ITypeConverter<string, DateTime>转换器。但是我找到了一种方法来参与我的TypeConverter参数,并根据用户的设置动态地将一些参数传递给它们,就像它们全局工作一样个人资料限制在当前用户范围内

也许国际奥委会可以这样帮助我。你有什么想法吗?

无论如何,我认为如果我通过Mapper.Initialize注册转换器,它也会影响其他在线用户,因为AutoMapper被IOC视为singelton对象。我正在寻找一种方法来遵守所有提到的规则。

1 个答案:

答案 0 :(得分:0)

每个AppDomain应调用一次Initialize。您可以通过Context.Items为每个Map调用传递参数。您可以在解析器/转换器中检查这些参数。您还可以使用依赖注入来通过注入每个请求帮助程序来实现相同的功能。文档为here