簡體   English   中英

共享Automapper解析器的最佳方法

[英]Best way to share Automapper Resolver

我有一個viewmodel設置,其中包含幾個指向服務器上文件的物理路徑字符串。 我有虛擬目錄指向服務器上的根文件夾。 我需要做的是將此物理路徑更改為引用虛擬文件夾的路徑,以便在頁面視圖中創建超級鏈接。

我希望做的是擁有一個通用的解析器,可以將密鑰傳遞給該解析器,然后讓它返回所需的路徑。 這是我的方法。 我只想看看是否有更簡單的“清潔”方法。 我僅使用mvc和c#已有幾個月,所以我仍在學習。

預先感謝。

這是映射器信息

        Mapper.CreateMap<FAG_DETAIL, OrderFagDetail>()
            .ForMember(dest => dest.TXT01, opt => opt.ResolveUsing<DrawingPathCorrect>())
            .ForMember(dest => dest.TXT02, opt => opt.ResolveUsing<Prog1PathCorrect>())
            .ForMember(dest => dest.TXT03, opt => opt.ResolveUsing<Prog2PathCorrect>())
            .ForMember(dest => dest.TXT04, opt => opt.ResolveUsing<Prog3PathCorrect>())
            .ForMember(dest => dest.TXT05, opt => opt.ResolveUsing<Prog4PathCorrect>())
            .ForMember(dest => dest.TXT07, opt => opt.ResolveUsing<Procs1PathCorrect>())
            .ForMember(dest => dest.TXT08, opt => opt.ResolveUsing<Procs2PathCorrect>())
            .ForMember(dest => dest.TXT09, opt => opt.ResolveUsing<Procs3PathCorrect>())
            .ForMember(dest => dest.TXT10, opt => opt.ResolveUsing<Procs4PathCorrect>())
            .ForMember(dest => dest.TXT11, opt => opt.ResolveUsing<FASPathCorrect>())
            .ForMember(dest => dest.TXT06, opt => opt.ResolveUsing<SecondDrawingPathCorrect>());

這是ModelView以及我當前正在使用的解析器。 用於OrderfagDetail的模型FAG_DETAIL非常大,因此在此不再贅述。 可以安全地假設源中存在與ModelView屬性完全匹配的屬性。

public class OrderFagDetail
{
    public decimal NO { get; set; }
    public decimal FKNO { get; set; }
    public decimal TYP { get; set; }
    public string TXT01 { get; set; } //drawing link
    public string TXT02 { get; set; } //First Op program or L20 Program
    public string TXT03 { get; set; } //Second op program or K16 Program
    public string TXT04 { get; set; } //Third op Program
    public string TXT05 { get; set; } //Fourth op Program
    public string TXT06 { get; set; } //Second drawing
    public string TXT07 { get; set; } //First Op process sheet
    public string TXT08 { get; set; } //Second Op process sheet
    public string TXT09 { get; set; } //Third Op process sheet
    public string TXT10 { get; set; } //Fourth Op process sheet
    public string TXT11 { get; set; } //First Article link

}

public interface IValueResolver
{
    ResolutionResult Resolve(ResolutionResult source);
}

public class SecondDrawingPathCorrect : ValueResolver<FAG_DETAIL, string>
{
    protected override string ResolveCore(FAG_DETAIL detail)
    {  
        PathResolver pr = new PathResolver();
        return (pr.ResolvePath(detail.TXT06,"PDFs\\"));
    }
}
public class PathResolver
{   
 public string ResolvePath(string strSrc, string strKey)
   {
       string corrected = "";
        if (strSrc.Length > 0)
        {                
            string inputdetail = strSrc;
            corrected = inputdetail.Substring(inputdetail.IndexOf(strKey)+strKey.Length, inputdetail.Length - inputdetail.IndexOf(strKey)-strKey.Length);
        }

        return (corrected);
   }

}

也許為了改進,您可以將PathResolver類設為static或singleton,不同之處在於Static Class:

  1. 您不能創建靜態類的實例。
  2. 加載包含類的程序或名稱空間時,.NET Framework公共語言運行時(CLR)自動加載。
  3. 靜態類不能具有構造函數。
  4. 我們不能將靜態類傳遞給方法。
  5. 我們不能在C#中將Static類繼承到另一個Static類。

辛格爾頓:

  1. 您可以創建該對象的一個​​實例並重新使用它。
  2. 當用戶請求時,首次創建Singleton實例。
  3. Singleton類可以具有構造函數。
  4. 您可以創建單例類的對象並將其傳遞給方法。
  5. Singleton類未說明繼承的任何限制。
  6. 我們可以處理單例類的對象,但不能處理靜態類的對象。

假設您有多個像這樣的CreateMap:

Mapper.CreateMap<PdfFileObject, MyViewModel>()
    .ForMember( d => d.Uri, opt => opt.ResolveUsing(something with "pdfs")
Mapper.CreateMap<ImageFileObject, MyViewModel>()
    .ForMember( d => d.Uri, opt => opt.ResolveUsing(something with "images")
..etc

像這樣創建您的解析器:

public class SecondDrawingPathCorrect<TFILE> : ValueResolver<FAG_DETAIL, string>
where TFILE : FAG_DETAIL
{
    private readonly string _replaceKey;
    public SecondDrawingPathCorrect(string replaceKey)
    {
        _replaceKey = replaceKey;
    }

    protected override string ResolveCore(FAG_DETAIL detail)
    {   
        string corrected = "";
        if (detail.TXT06.Length > 0)
        {                
            string inputdetail = detail.TXT06;
            corrected = inputdetail.Substring(inputdetail.IndexOf(_replaceKey) + 5, inputdetail.Length - inputdetail.IndexOf("_replaceKey) - 5);
        }

        return corrected;
    }
}

像這樣注冊您的地圖:

Mapper.CreateMap<PdfFileObject, MyViewModel>()
    .ForMember( d => d.Uri, opt => opt.ResolveUsing(new SecondDrawingPathCorrect<PdfFileObject>("PDFs");

為使以上各項起作用,您的PfdFileObject,ImageFileObject等應實現/繼承FAG_DETAIL。

還有另一個選擇,如果您可以控制FAG_DETAIL,則可以在其上公開屬性字符串FilePathPrefix(對於PdfFileObject,該屬性字符串將返回“ PDF”)。 然后,您可以在解析器本身中使用它(即,在“替換”部分中使用detail.FilePrefix而不是_replaceKey)。

使用最新的版本,您可以刪除resolver的通用部分,並進行如下注冊:

Mapper.CreateMap<FAG_DETAIL, MyViewModel>()
        .ForMember( d => d.Uri, opt => opt.ResolveUsing<SecondDrawingPathCorrect>()
.Include<PdfFileObject, MyViewModel>()
.Include<ImageFileObject, MyViewModel>()
...more includes;

暫無
暫無

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

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