共享自动映射器解析器的最佳方式
本文关键字:最佳 方式 映射 共享 | 更新日期: 2023-09-27 17:56:36
我设置了一个视图模型,其中包含指向服务器上文件的多个物理路径字符串。我有指向服务器上根文件夹的虚拟目录。我需要做的是将此物理路径更改为引用虚拟文件夹的路径,以便我可以在页面视图中创建超链接。
我希望做的是有一个通用的解析器,我可以将密钥传递给它,然后让它返回我需要的路径。这是我是如何做到的。我只是想看看是否有更简单的"更清洁"的方法。我只使用 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>());
这是模型视图以及我当前使用的解析器。作为OrderfagDetail解决方案的模型FAG_DETAIL非常大,所以我不会在这里包含它。可以安全地假设源中存在与模型视图属性完全匹配的属性。
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 类设置为静态或单例区别在于静态类:
- 不能创建静态类的实例。
- 由 .NET Framework 公共语言运行库自动加载 (CLR) 加载包含类的程序或命名空间时。
- 静态类不能有构造函数。
- 我们不能将静态类传递给方法。
- 我们不能将静态类继承到 C# 中的另一个静态类。
单身 人士:
- 您可以创建对象的一个实例并重复使用它。
- 当用户首次创建单一实例时 要求。
- 单例类可以有构造函数。
- 您可以创建单例类的对象并将其传递给方法。
- 单例类没有说继承的任何限制。
- 我们可以处理单例类的对象,但不能处理静态的对象 .class。
假设你有多个像这样的创建映射:
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")。然后您可以在解析器本身(即在"替换"部分使用细节)中使用它。文件前缀而不是_replaceKey)。
使用最新的,您可以删除解析器的通用部分,并像这样进行注册:
Mapper.CreateMap<FAG_DETAIL, MyViewModel>()
.ForMember( d => d.Uri, opt => opt.ResolveUsing<SecondDrawingPathCorrect>()
.Include<PdfFileObject, MyViewModel>()
.Include<ImageFileObject, MyViewModel>()
...more includes;