簡體   English   中英

如何只為當前用戶設置AutoMapper全局配置?

[英]How to set an AutoMapper global configuration just for current user?

簡介

我有一個帶有AutoMapperIOCStructureMap )的Asp.Net MVC項目,一切正常。

我聲明了一些AutoMapper Profiles ,並由IOC注冊了它們,最后在某些類的承包商中使用IMappingEngine在其中使用AutoMapper

AutoMapper Version:   4.0.4
StructureMap Version: 4.2.0.402

問題:

我想根據當前用戶時區聲明為所有AutoMapper配置文件設置全局轉換配置

此AutoMapper的規則轉換配置:

  • 應該是所有AutoMapper配置文件的全局配置
  • 應該是用戶每次向我們發送請求時在項目中的某個位置,我們根據用戶時區聲明設置了該請求
  • 不應影響其他聯機用戶的AutoMapper配置(不應是IOC中AutoMapper的單例對象的設置)

我做了什么:

我在繼承自AuthorizeAttribute的類的OnAuthorization方法中編寫以下配置,並在項目的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 ControllerController Factory


我的問題:

  • 考慮到項目中描述的IOC ,是否需要對Mapper.Initialize影響其他在線用戶的AutoMapper配置?
  • 我應該如何編寫提到的AutoMapper轉換配置以符合上述規則?
  • 在哪里寫它更好( Base ControllerController Factory ,自定義AuthorizeAttribute或...)?

更新:

我真的想在AutoMapper中定義一些自定義類型轉換器 您可以閱讀它,並在那里看到一些ITypeConverter轉換器,例如ITypeConverter<string, DateTime> 但是我正在尋找一種方法來參數化TypeConverter並根據用戶的設置在每個請求中動態地向它們傳遞一些參數,方法是它們對於所有配置文件都是全局工作的僅限於當前用戶范圍

也許國際奧委會可以通過這種方式幫助我。 你有什么想法嗎?

無論如何,我認為如果我通過Mapper.Initialize注冊轉換器, Mapper.InitializeMapper.Initialize影響其他在線用戶,因為IOC將AutoMapper視為singelton對象。 我正在尋找一種方法來一起遵守所有提到的規則。

每個AppDomain應該調用一次Initialize。 您可以通過Context.Items為每個Map調用傳遞參數。 您可以在解析器/轉換器中檢查這些參數。 您還可以通過注入每個請求助手來使用依賴項注入來實現相同的目的。 文檔在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM