详解二维码生成工厂

2019-12-30 15:37:10王振洲


#region 基础配置信息
 /// <summary>
 /// 接口地址(必填)
 /// </summary>
 protected string ApiUrl = "https://www.easck.com/chart";
 /// <summary>
 /// 展示内容(文本内容),google文本参数直接传递http地址直接重定向
 /// </summary>
 protected string Content = "http://www.easck.com/wangrudong003/";
 /// <summary>
 /// 保存二维码的磁盘路径(默认程序跟目录+QRCode)
 /// </summary>
 protected string SaveQRPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "QRCode");
 /// <summary>
 /// Logo图片地址(http://www.easck.com/baike/w%3D268%3Bg%3D0/sign=9a34e44d8bd4b31cf03c93bdbfed4042/2cf5e0fe9925bc318cb9fe965edf8db1ca1370dc.jpg";
 /// <summary>
 /// 宽度和高度(二维码正方形的,高宽一至,默认200)
 /// </summary>
 protected int WAndH = 200;
#endregion

然后,这里我不想每个接口都手动new一次来创建对象,所以用了加载程序集的模块的方式来创建所需要的对象,因此有了工厂类的入口:


/// <summary>
 /// 二维码生成工厂
 /// </summary>
 public class QRCodeReposity
 {
 public static BaseQRCode Current(QREmType qrEmType = QREmType.BaseQRCode)
 {
 var nspace = typeof(BaseQRCode);
 var fullName = nspace.FullName;
 var nowspace = fullName.Substring(0, fullName.LastIndexOf('.') + 1);
 return Assembly.GetExecutingAssembly().CreateInstance(nowspace + qrEmType.ToString(), true) as BaseQRCode;
 }
 }

这里和之前的缓存工厂文章设计差不多,可以查阅下之前的分享篇,也多多点赞,谢谢;下面在给出说有的代码如下:


/// <summary>
 /// 工厂模块定义
 /// </summary>
 public enum QREmType
 {
 /// <summary>
 /// google接口
 /// </summary>
 BaseQRCode,
 /// <summary>
 /// 2d-code接口
 /// </summary>
 QR_2dCode,
 /// <summary>
 /// topscan接口
 /// </summary>
 QR_TopScan
 }
 /// <summary>
 /// 二维码生成工厂
 /// </summary>
 public class QRCodeReposity
 {
 public static BaseQRCode Current(QREmType qrEmType = QREmType.BaseQRCode)
 {
 var nspace = typeof(BaseQRCode);
 var fullName = nspace.FullName;
 var nowspace = fullName.Substring(0, fullName.LastIndexOf('.') + 1);
 return Assembly.GetExecutingAssembly().CreateInstance(nowspace + qrEmType.ToString(), true) as BaseQRCode;
 }
 }
 /// <summary>
 /// 基类使用Google提供Api:https://www.easck.com/chart/infographics/docs/qr_codes ,由于是国外地址,相对来说有点慢
 /// </summary>
 public class BaseQRCode
 {
 #region 基础配置信息
 /// <summary>
 /// 接口地址(必填)
 /// </summary>
 protected string ApiUrl = "https://www.easck.com/chart";
 /// <summary>
 /// 展示内容(文本内容),google文本参数直接传递http地址直接重定向
 /// </summary>
 protected string Content = "http://www.easck.com/wangrudong003/";
 /// <summary>
 /// 保存二维码的磁盘路径(默认程序跟目录+QRCode)
 /// </summary>
 protected string SaveQRPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "QRCode");
 /// <summary>
 /// Logo图片地址(http://www.easck.com/baike/w%3D268%3Bg%3D0/sign=9a34e44d8bd4b31cf03c93bdbfed4042/2cf5e0fe9925bc318cb9fe965edf8db1ca1370dc.jpg";
 /// <summary>
 /// 宽度和高度(二维码正方形的,高宽一至,默认200)
 /// </summary>
 protected int WAndH = 200;
 #endregion
 #region 方法
 #region 生成二维码
 /// <summary>
 /// 生成二维码
 /// </summary>
 /// <param name="content">展示内容(文本内容 或者 扫描后的跳转http://www.easck.com/// <summary>
 /// 下载图片
 /// </summary>
 /// <param name="url">图片下载地址</param>
 /// <param name="savePath">保存路径默认:Img文件夹</param>
 /// <param name="format">默认:Jpeg</param>
 /// <returns>新图片名称</returns>
 public virtual string DownImg(string url, string savePath = "QRCode", ImageFormat format = null)
 {
 var qrName = string.Empty;
 try
 {
 format = format ?? ImageFormat.Jpeg;
 HttpClient http = new HttpClient();
 http.Timeout = new TimeSpan(0, 1, 0);
 using (var stream = http.GetStreamAsync(url).Result)
 {
 if (!Directory.Exists(SaveQRPath)) { Directory.CreateDirectory(SaveQRPath); }
 qrName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + format;
 var path = Path.Combine(savePath, qrName);
 using (Image img = Image.FromStream(stream))
 {
 img.Save(path, format);
 }
 }
 }
 catch (Exception ex)
 {
 qrName = string.Empty;
 }
 return qrName;
 }
 #endregion
 #endregion
 }
 /// <summary>
 /// 使用2d-code提供Api,需要去官网注册获取Key
 /// </summary>
 public class QR_2dCode : BaseQRCode
 {
 public QR_2dCode()
 {
 ApiUrl = "http://www.easck.com/2dcode/api.php";
 }
 #region 生成二维码
 /// <summary>
 /// 生成二维码
 /// </summary>
 /// <param name="content">展示内容(文本内容 或者 扫描后的跳转http://www.easck.com/// <summary>
 /// 使用topscan提供Api
 /// </summary>
 public class QR_TopScan : BaseQRCode
 {
 public QR_TopScan()
 {
 ApiUrl = "http://www.easck.com/api.php";
 }
 #region 生成二维码
 /// <summary>
 /// 生成二维码
 /// </summary>
 /// <param name="content">展示内容(文本内容 或者 扫描后的跳转http://www.easck.com/pre>