日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式在实际业务应用中的介绍之2——业务工厂

發布時間:2025/3/15 asp.net 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式在实际业务应用中的介绍之2——业务工厂 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在C#中實現的基于工廠模式打造的業務應用案,全部都是干貨。

以前一直沒有想過寫一些東西來把項目中用到的知識點及技術實現做一個歸納整理并分享出來。現在打算逐漸的把項目中的一些東西整理并分享出來,與大家共勉!

工廠模式相比大家都比較清楚了,現在就該模式在實際項目中的應用做一個實例分享。

工廠模式的核心點就是可以依據應用自由組裝業務實現,靈活的適應業務變更,極大的增強系統對業務變更的應變能力。


下面就拿實際項目WMS中的一個模塊倉庫管理來與大家分享,先簡單描述下實現思路:

根據需求分析將倉庫管理模塊進行業務建模,然后抽象出該模塊應該具備的功能,
根據抽象結果分別創建該模塊的抽象業務類Warehousebiz及該類的實現類Warehousebiz。

1、先看看結構圖:

2、定義業務抽象類Warehousebiz,根據業務抽象該模塊的應有功能,下面節選4個功能來介紹
1)獲取數據庫倉庫GetWarehouses

2)獲取數據庫倉庫貨架GetStorage_racks
3)獲取數據庫倉庫貨架區域GetStorage_rack_zones
4)獲取綁定記錄GetPack_bindingPager

Warehousebiz類定義

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Web;
using System.Web.Caching;

using Entitys.ComonEnti;
using Common;
using FrameCommon;
using Warehouse.Entities;

namespace Warehouse.Biz
{
public abstract class Warehousebiz : System.MarshalByRefObject
{
public DataTable i18nCommonCurrLang = new DataTable(); //通用語言包
public DataTable i18nWarehouseManageri18nLang = new DataTable(); //Somebiz語言包
public SysEnvironmentSerialize envirObj = null; //傳遞框架環境

public string logpathForDebug = APPConfig.GetAPPConfig().GetConfigValue("logpathForDebug", ""); //調試日志路徑
public string isLogpathForDebug = APPConfig.GetAPPConfig().GetConfigValue("isLogpathForDebug", ""); //是否記錄調試日志

public string baseXmlPath = APPConfig.GetAPPConfig().GetConfigValue("XmldataPath", "");

public Warehousebiz(SysEnvironmentSerialize _envirObj)
{
string _currlang = _envirObj.I18nCurrLang;
System.Web.Caching.Cache currCache = HttpRuntime.Cache; //當前緩存
string defaultlang = APPConfig.GetAPPConfig().GetConfigValue("currlang", ""); //默認語種
this.envirObj = _envirObj;

#region 通用語言包

DataTable comlangtmp = (DataTable)currCache.Get("i18nCommonCurrLang");
if (comlangtmp != null)
{
if (defaultlang == _currlang)
{
i18nCommonCurrLang = comlangtmp;
}
else
{
string commoni18nLangPath = string.Format(APPConfig.GetAPPConfig().GetConfigValue("Commoni18nLang", ""), _currlang);
i18nCommonCurrLang = BaseServiceUtility.GetI18nLang(commoni18nLangPath);
}
}
else
{
string commoni18nLangPath = string.Format(APPConfig.GetAPPConfig().GetConfigValue("Commoni18nLang", ""), _currlang);
i18nCommonCurrLang = BaseServiceUtility.GetI18nLang(commoni18nLangPath);
}

#endregion

#region Warehouse語言包

DataTable servFrameSecuriylangtmp = (DataTable)currCache.Get("i18nWarehousei18nLang");
if (servFrameSecuriylangtmp != null)
{
if (defaultlang == _currlang)
{
i18nWarehouseManageri18nLang = servFrameSecuriylangtmp;
}
else
{
string WarehouseSomebizi18nLang = string.Format(this.baseXmlPath + APPConfig.GetAPPConfig().GetConfigValue("WarehouseManageri18nLang", ""), _currlang);
i18nWarehouseManageri18nLang = BaseServiceUtility.GetI18nLang(WarehouseSomebizi18nLang);
}
}
else
{
string WarehouseSomebizi18nLang = string.Format(this.baseXmlPath + APPConfig.GetAPPConfig().GetConfigValue("WarehouseManageri18nLang", ""), _currlang);
i18nWarehouseManageri18nLang = BaseServiceUtility.GetI18nLang(WarehouseSomebizi18nLang);
}

#endregion

}

public bool JudgeObjectValue(object obj)
{
if(obj == null)
{
return false;
}
else if((string)obj == string.Empty)
{
return false;
}

return true;
}

/// <summary>
/// 獲取數據庫倉庫
/// </summary>
/// <param name="warehouse"></param>
/// <param name="ddnmParams"></param>
/// <param name="errStr"></param>
/// <param name="ListBizLog"></param>
/// <returns></returns>
public abstract List<WAREHOUSE> GetWarehouses(WAREHOUSE warehouse, DistributeDataNodeManagerParams ddnmParams, List<string> errStr, List<SSY_LOGENTITY> ListBizLog);

/// <summary>
/// 獲取數據庫倉庫貨架
/// </summary>
/// <param name="bizobj"></param>
/// <param name="ddnmParams"></param>
/// <param name="errStr"></param>
/// <param name="ListBizLog"></param>
/// <returns></returns>
public abstract List<STORAGE_RACK> GetStorage_racks(STORAGE_RACK bizobj, DistributeDataNodeManagerParams ddnmParams, List<string> errStr, List<SSY_LOGENTITY> ListBizLog);

/// <summary>
/// 獲取數據庫倉庫貨架區域
/// </summary>
/// <param name="bizobj"></param>
/// <param name="ddnmParams"></param>
/// <param name="errStr"></param>
/// <param name="ListBizLog"></param>
/// <returns></returns>
public abstract List<STORAGE_RACK_ZONE> GetStorage_rack_zones(STORAGE_RACK_ZONE bizobj, DistributeDataNodeManagerParams ddnmParams, List<string> errStr, List<SSY_LOGENTITY> ListBizLog);

/// <summary>
/// 獲取綁定記錄
/// </summary>
/// <param name="bizobj"></param>
/// <param name="ddnmParams"></param>
/// <param name="pager"></param>
/// <param name="errStr"></param>
/// <param name="ListBizLog"></param>
/// <returns></returns>
public abstract List<PACK_BINDING> GetPack_bindingPager(PACK_BINDING bizobj, DistributeDataNodeManagerParams ddnmParams, SSY_PagingParam pager, List<string> errStr, List<SSY_LOGENTITY> ListBizLog);


}
}


3、定義業務抽象類Warehousebiz的實現類BizExectuteWarehousebiz,該類基礎業務抽象類,并實現上面的4個節選功能
1)獲取數據庫倉庫GetWarehouses

2)獲取數據庫倉庫貨架GetStorage_racks
3)獲取數據庫倉庫貨架區域GetStorage_rack_zones
4)獲取綁定記錄GetPack_bindingPager

BizExectuteWarehousebiz類定義

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Reflection;

using Warehouse.Biz;
using Entitys.ComonEnti;
using DataAccessLayer.DataBaseFactory;
using Common;
using FrameCommon;
using Warehouse.Entities;

namespace Warehouse.BizExectute
{
public class BizExectuteWarehousebiz : Warehousebiz
{
public BizExectuteWarehousebiz(SysEnvironmentSerialize _envirObj): base(_envirObj)
{

}

/// <summary>
/// 獲取數據庫倉庫
/// </summary>
/// <param name="warehouse"></param>
/// <param name="ddnmParams"></param>
/// <param name="errStr"></param>
/// <param name="ListBizLog"></param>
/// <returns></returns>
public override List<WAREHOUSE> GetWarehouses(WAREHOUSE warehouse, DistributeDataNodeManagerParams ddnmParams, List<string> errStr, List<SSY_LOGENTITY> ListBizLog)
{
List<WAREHOUSE> listReturn = new List<WAREHOUSE>();
DataSet ds = null;
StringBuilder sbb = new StringBuilder();

try
{
sbb.AppendLine(string.Format(@" select * FROM {0}.WAREHOUSE where 1 = 1 ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.DbSchema));

List<IDataParameter> parameters = new List<IDataParameter>();
if (warehouse != null)
{
#region 處理參數

if (base.JudgeObjectValue(warehouse.WH_CODE))
{
sbb.AppendLine(string.Format(@"and WH_CODE = {0}WH_CODE ", DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));

parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataParameter(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign() + "WH_CODE",
DbType.String, warehouse.WH_CODE.ToString()));
}
if (base.JudgeObjectValue(warehouse.WH_NAME))
{
sbb.AppendLine(string.Format(@"and WH_NAME like '%' {0} {1}WH_NAME {0} '%' ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ConnectChar(),
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));

parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataParameter(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign() + "WH_NAME",
DbType.String, warehouse.WH_NAME.ToString()));
}

#endregion
}

ds = DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataSet(sbb.ToString(), SqlExecType.SqlText, parameters.ToArray());

if (Common.Utility.DsHasData(ds))
{
listReturn = Common.UtilitysForT<WAREHOUSE>.GetListsObj(ds.Tables[0]);
}
else
{
errStr.Add(BaseServiceUtility.GetI18nLangItem("noFindData", base.i18nCommonCurrLang));
}
}
catch (Exception ex)
{
errStr.Add(BaseServiceUtility.GetI18nLangItem("findDataErr", base.i18nCommonCurrLang) + ex.Message);
}

return listReturn;
}

/// <summary>
/// 獲取數據庫倉庫貨架
/// </summary>
/// <param name="bizobj"></param>
/// <param name="ddnmParams"></param>
/// <param name="errStr"></param>
/// <param name="ListBizLog"></param>
/// <returns></returns>
public override List<STORAGE_RACK> GetStorage_racks(STORAGE_RACK bizobj, DistributeDataNodeManagerParams ddnmParams, List<string> errStr, List<SSY_LOGENTITY> ListBizLog)
{
List<STORAGE_RACK> listReturn = new List<STORAGE_RACK>();
DataSet ds = null;
StringBuilder sbb = new StringBuilder();

try
{
sbb.AppendLine(string.Format(@" select * FROM {0}.STORAGE_RACK where 1 = 1 ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.DbSchema));

List<IDataParameter> parameters = new List<IDataParameter>();
if (bizobj != null)
{
#region 處理參數

if (base.JudgeObjectValue(bizobj.SR_CODE))
{
sbb.AppendLine(string.Format(@"and SR_CODE = {0}SR_CODE ", DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));

parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataParameter(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign() +
"SR_CODE", DbType.String, bizobj.SR_CODE.ToString()));
}
if (base.JudgeObjectValue(bizobj.WH_ID))
{
sbb.AppendLine(string.Format(@"and WH_ID = {0}WH_ID ", DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));

parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataParameter(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign() +
"WH_ID", DbType.String, bizobj.WH_ID.ToString()));
}
if (base.JudgeObjectValue(bizobj.SR_NAME))
{
sbb.AppendLine(string.Format(@"and SR_NAME like '%' {0} {1}SR_NAME {0} '%' ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ConnectChar(),
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));

parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataParameter(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign() +
"SR_NAME", DbType.String, bizobj.SR_NAME.ToString()));
}

#endregion
}

ds = DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataSet(sbb.ToString(), SqlExecType.SqlText, parameters.ToArray());

if (Common.Utility.DsHasData(ds))
{
listReturn = Common.UtilitysForT<STORAGE_RACK>.GetListsObj(ds.Tables[0]);
}
else
{
errStr.Add(BaseServiceUtility.GetI18nLangItem("noFindData", base.i18nCommonCurrLang));
}
}
catch (Exception ex)
{
errStr.Add(BaseServiceUtility.GetI18nLangItem("findDataErr", base.i18nCommonCurrLang) + ex.Message);
}

return listReturn;
}

?

/// <summary>
/// 獲取數據庫倉庫貨架區域
/// </summary>
/// <param name="bizobj"></param>
/// <param name="ddnmParams"></param>
/// <param name="errStr"></param>
/// <param name="ListBizLog"></param>
/// <returns></returns>
public override List<STORAGE_RACK_ZONE> GetStorage_rack_zones(STORAGE_RACK_ZONE bizobj, DistributeDataNodeManagerParams ddnmParams, List<string> errStr, List<SSY_LOGENTITY> ListBizLog)
{
List<STORAGE_RACK_ZONE> listReturn = new List<STORAGE_RACK_ZONE>();
DataSet ds = null;
StringBuilder sbb = new StringBuilder();

try
{
sbb.AppendLine(string.Format(@" select * FROM {0}.STORAGE_RACK_ZONE where 1 = 1 ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.DbSchema));

List<IDataParameter> parameters = new List<IDataParameter>();
if (bizobj != null)
{
#region 處理參數

if (base.JudgeObjectValue(bizobj.SRZ_CODE))
{
sbb.AppendLine(string.Format(@"and SRZ_CODE = {0}SRZ_CODE ", DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));

parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataParameter(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign() +
"SRZ_CODE", DbType.String, bizobj.SRZ_CODE.ToString()));
}
if (base.JudgeObjectValue(bizobj.SR_ID))
{
sbb.AppendLine(string.Format(@"and SR_ID = {0}SR_ID ", DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));

parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataParameter(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign() +
"SR_ID", DbType.String, bizobj.SR_ID.ToString()));
}
if (base.JudgeObjectValue(bizobj.SRZ_NAME))
{
sbb.AppendLine(string.Format(@"and SRZ_NAME like '%' {0} {1}SRZ_NAME {0} '%' ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ConnectChar(),
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));

parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataParameter(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign() +
"SRZ_NAME", DbType.String, bizobj.SRZ_NAME.ToString()));
}

#endregion
}

ds = DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataSet(sbb.ToString(), SqlExecType.SqlText, parameters.ToArray());

if (Common.Utility.DsHasData(ds))
{
listReturn = Common.UtilitysForT<STORAGE_RACK_ZONE>.GetListsObj(ds.Tables[0]);
}
else
{
errStr.Add(BaseServiceUtility.GetI18nLangItem("noFindData", base.i18nCommonCurrLang));
}
}
catch (Exception ex)
{
errStr.Add(BaseServiceUtility.GetI18nLangItem("findDataErr", base.i18nCommonCurrLang) + ex.Message);
}

return listReturn;
}


/// <summary>
/// 獲取綁定記錄
/// </summary>
/// <param name="bizobj"></param>
/// <param name="ddnmParams"></param>
/// <param name="pager"></param>
/// <param name="errStr"></param>
/// <param name="ListBizLog"></param>
/// <returns></returns>
public override List<PACK_BINDING> GetPack_bindingPager(PACK_BINDING bizobj, DistributeDataNodeManagerParams ddnmParams, SSY_PagingParam pager, List<string> errStr, List<SSY_LOGENTITY> ListBizLog)
{
List<PACK_BINDING> listReturn = new List<PACK_BINDING>();

//分頁數據獲取實現
//分頁參數數據
SSY_PagingExecuteParam pageExecute = new SSY_PagingExecuteParam();
pageExecute.PagingParam = pager;

//參數值,若有,增加到該集合
List<IDataParameter> parameters = new List<IDataParameter>();
StringBuilder sbbSqlWhere = new StringBuilder();
if (bizobj != null)
{
if (Utility.ObjHasData(bizobj.PACK_TYPE))
{
sbbSqlWhere.AppendLine(string.Format(@"and PACK_TYPE = {0}PACK_TYPE ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));
parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.
GetDataParameter("PACK_TYPE",
DbType.String, bizobj.PACK_TYPE.ToString()));
}
if (Utility.ObjHasData(bizobj.BOX_NO))
{
sbbSqlWhere.AppendLine(string.Format(@"and BOX_NO = {0}BOX_NO ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));
parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.
GetDataParameter("BOX_NO",
DbType.String, bizobj.BOX_NO.ToString()));
}
if (Utility.ObjHasData(bizobj.TRACE_NO))
{
sbbSqlWhere.AppendLine(string.Format(@"and TRACE_NO = {0}TRACE_NO ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));
parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.
GetDataParameter("TRACE_NO",
DbType.String, bizobj.TRACE_NO.ToString()));
}

if (Utility.ObjHasData(bizobj.IN_WH_CODE))
{
sbbSqlWhere.AppendLine(string.Format(@"and IN_WH_CODE = {0}IN_WH_CODE ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));
parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.
GetDataParameter("IN_WH_CODE",
DbType.String, bizobj.IN_WH_CODE.ToString()));
}

if (Utility.ObjHasData(bizobj.IN_SR_CODE))
{
sbbSqlWhere.AppendLine(string.Format(@"and IN_SR_CODE = {0}IN_SR_CODE ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));
parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.
GetDataParameter("IN_SR_CODE",
DbType.String, bizobj.IN_SR_CODE.ToString()));
}
if (Utility.ObjHasData(bizobj.IN_SRZ_CODE))
{
sbbSqlWhere.AppendLine(string.Format(@"and IN_SRZ_CODE = {0}IN_SRZ_CODE ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.ParamSign()));
parameters.Add(DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.
GetDataParameter("IN_SRZ_CODE",
DbType.String, bizobj.IN_SRZ_CODE.ToString()));
}
}

pageExecute.TableNameOrView = string.Format(@" {0}.PACK_BINDING ",
DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.DbSchema);

//pageExecute.Joins = string.Empty;
pageExecute.Joins = " left join (select optioniden, optionnames as pack_type_name from ssy_biz_dict where domainnameiden = 'Pack_Type') on pack_type = optioniden ";
pageExecute.Fields = "*";
pageExecute.OrderField = "BIND_NO";
pageExecute.SqlWhere = " 1=1 " + sbbSqlWhere.ToString();

StringBuilder sbbSql = new StringBuilder();
if (pager.TotalSize == 0)
{
//首次計算總記錄
sbbSql.Clear();
if (string.IsNullOrEmpty(pageExecute.SqlWhere))
{
sbbSql.Append(string.Format(@"SELECT count(*) as cnt FROM {0} {1} ", pageExecute.TableNameOrView, pageExecute.Joins));
}
else
{
sbbSql.Append(string.Format(@"SELECT count(*) as cnt FROM {0} {1} where {2} ", pageExecute.TableNameOrView, pageExecute.Joins,
pageExecute.SqlWhere));
}

DataTable dt = DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataTable(sbbSql.ToString(),
SqlExecType.SqlText, parameters.ToArray());

if (Utility.DtHasData(dt))
{
pager.TotalSize = int.Parse(dt.Rows[0]["cnt"].ToString());
}
}

DataTable dtTmp = DBFactorySingleton.GetInstance(ddnmParams.DistributeDataNode).Factory.GetDataPager(pageExecute, parameters.ToArray());

if (Common.Utility.DtHasData(dtTmp))
{
listReturn = Common.UtilitysForT<PACK_BINDING>.GetListsObj(dtTmp);
}
else
{
errStr.Add(BaseServiceUtility.GetI18nLangItem("noFindData", base.i18nCommonCurrLang));
}

return listReturn;
}


?

#region 私有方法

/// <summary>
/// 判讀庫位當前狀態
/// </summary>
/// <param name="listReturn"></param>
/// <param name="drPosition"></param>
/// <returns></returns>
private string JudgePositionState(List<PACK_BINDING> listReturn, DataRow drPosition)
{
StringBuilder sbb = new StringBuilder();
if(drPosition["srzp_isuse"].ToString() == "0")
{
sbb.Append("禁用|fa fa-times|divnouse|");
}
else
{
bool hasPosition = false;
string pack_type_name = string.Empty;
string box_no = string.Empty;
for (int i = 0; i < listReturn.Count; i++)
{
if(drPosition["srzp_code"].ToString() == listReturn[i].IN_SRZP_CODE.ToString())
{
hasPosition = true;
pack_type_name = listReturn[i].PACK_TYPE_NAME.ToString();
box_no = listReturn[i].BOX_NO.ToString();
break;
}
}
if (hasPosition)
{
sbb.Append(pack_type_name + "|fa fa-align-justify|divuse|" + box_no);
}
else
{
sbb.Append("空貨位|fa fa-square-o|divuseempty|");
}
}

return sbb.ToString();
}

#endregion

?

}
}


4、定義普通業務工廠類BizFactoryWarehouse,負責裝配業務類
BizFactoryWarehouse類定義

public class BizFactoryWarehouse
{
public Warehousebiz Create(string bizType, SysEnvironmentSerialize _envirObj)
{
if (bizType == "one")
{
//return new BizExectuteCommon();
return AOPFactory.Create<BizExectuteWarehousebiz>(new BizExectuteWarehousebiz(_envirObj));
}
return null;
}
}

5、定義泛型業務工廠類BizFactoryWarehouse<T>,該類和普通工廠類干一樣的事情,只是泛型可以支持多種類型,這里支持業務類變更類型
具體使用普通業務工廠還是泛型業務工廠,完全取決于應用需求
BizFactoryWarehouse<T>類定義

/// <summary>
/// 泛型工廠
/// </summary>
/// <typeparam name="T"></typeparam>
public class BizFactoryWarehouse<T>
{
public T Create(string bizType, SysEnvironmentSerialize _envirObj)
{
return (T)this.GetBiz(bizType, _envirObj);
}

public object GetBiz(string bizType, SysEnvironmentSerialize _envirObj)
{
if (bizType == "one")
{
return AOPFactory.Create<BizExectuteWarehousebiz>(new BizExectuteWarehousebiz(_envirObj));
}
return null;
}
}

6、定義AOP模式工廠類AOPFactory,負責橫切(也有的叫劫持)業務類
AOPFactory類定義

public static class AOPFactory
{
public static T Create<T>(T target)
{
DueWithAOP<T> dwAOP = new DueWithAOP<T>(target);
return (T)(dwAOP.GetTransparentProxy());
}
}

7、定義AOP模式處理類DueWithAOP<T>,AOPFactory類需要依賴DueWithAOP<T>處理類,該類負責橫切業務類,同時執行權限驗證、日志記錄等同用功能
DueWithAOP<T>類定義

public class DueWithAOP<T> : RealProxy
{
public string logpathForDebug = APPConfig.GetAPPConfig().GetConfigValue("logpathForDebug", ""); //調試日志路徑
public string isLogpathForDebug = APPConfig.GetAPPConfig().GetConfigValue("isLogpathForDebug", ""); //是否記錄調試日志

public T Target
{
get; internal set;
}

public DueWithAOP(T target) : base(typeof(T))
{
this.Target = target;
}

public override IMessage Invoke(IMessage msg)
{
#region 日志準備

List<string> opObjPerporty = UtilitysForT<SSY_LOGENTITY>.GetAllColumns(new SSY_LOGENTITY()); //要操作的屬性名
List<string> opWherePerporty = new List<string>(); //where條件屬性名
opWherePerporty.Add("LOGID");
List<string> mainProperty = new List<string>(); //主鍵屬性名
mainProperty.Add("LOGID");

//string errStr = string.Empty;
List<string> errStr = new List<string>();
List<SSY_LOGENTITY> opList = new List<SSY_LOGENTITY>();
SSY_LOGENTITY logenti = null;

BizExectuteCommon recordLog = new BizExectuteCommon(ManagerSysEnvironment.GetSysEnvironmentSerialize()); //其他工廠記錄日志也利用該公共方法

//日志固定部分
string USERNAMES = string.Empty;
if (FrameCommon.SysEnvironment.SysUserDict != null)
{
if (FrameCommon.SysEnvironment.SysUserDict.USERNAME != null)
{
USERNAMES = FrameCommon.SysEnvironment.SysUserDict.USERNAME.ToString();
}
}
string IPS = string.Empty;
if (!string.IsNullOrEmpty(FrameCommon.SysEnvironment.Ips))
{
IPS = FrameCommon.SysEnvironment.Ips;
}
string SYSTEMNAME = string.Empty;
if (!string.IsNullOrEmpty(FrameCommon.SysEnvironment.distManagerParam.DistributeDataNodes[0].Systemname))
{
SYSTEMNAME = FrameCommon.SysEnvironment.distManagerParam.DistributeDataNodes[0].Systemname;
}

#endregion

IMethodCallMessage mcall = (IMethodCallMessage)msg; //劫持方法,準備執行
var resResult = new ReturnMessage(new Exception(), mcall);

#region 獲取必要參數

//distributeActionIden 分布式動作識別, 必須存在
//distributeDataNodes 分布式數據節點集合, 必須存在
//distributeDataNode 分布式數據節點參數, 必須存在
//distriActionSql 分布式操作sql集合,必須存在,包括sql正文和參數
//ddnmParams

//singleActionList 單點操作失敗集合, out參數 非必須存在,傳入空的參數即可

//TODO 檢查必須的參數,若不存在不進行執行業務方法,返回執行異常

//獲取分布式管理參數
DistributeDataNodeManagerParams distManagerParam = new DistributeDataNodeManagerParams();
for (int i = 0; i < mcall.InArgs.Length; i++)
{
if (mcall.GetInArgName(i).ToUpper() == "ddnmParams".ToUpper())
{
distManagerParam = ((DistributeDataNodeManagerParams)mcall.GetInArg(i));
//SYSTEMNAME = distManagerParam.DistributeDataNodes[0].Systemname;
break;
}
}

//獲取分布式動作識別參數
DistributeActionIden distBAC = distManagerParam.DistributeActionIden;

//加載數據節點集合,然后根據節點數量及分布式動作識別初始化分布式數據節點及分布式事務處理
//數據節點集合由服務方法傳入
//獲取數據節點集合參數
List<SSY_DATANODE_ADDR> dataNodes = distManagerParam.DistributeDataNodes;

//獲取數據節點參數
DistributeDataNode ddn = distManagerParam.DistributeDataNode;

//單點操作失敗集合,最后要報告給節點中心,out參數
bool permitSingleDataOperation = false; //是否支持單點操作失敗后進行報告
List<SSY_DATA_ACTION_TASK> data_action_task = new List<SSY_DATA_ACTION_TASK>();
for (int i = 0; i < mcall.InArgs.Length; i++)
{
if (mcall.GetInArgName(i).ToUpper() == "singleActionList".ToUpper())
{
permitSingleDataOperation = true;
data_action_task = mcall.GetInArg(i) as List<SSY_DATA_ACTION_TASK>;
break;
}
}

#endregion

if (distBAC == DistributeActionIden.Query)
{
//處理數據節點
//distManagerParam.DistributeDataNode
distManagerParam.DistributeDataNode.Connectionstring = string.Format(dataNodes[0].Data_conn, dataNodes[0].Url_addr,
dataNodes[0].Data_user, dataNodes[0].Data_password);
distManagerParam.DistributeDataNode.DbSchema = dataNodes[0].Data_schema;

//只執行一次即可
#region 執行業務方法

try
{
object objRv = mcall.MethodBase.Invoke(this.Target, mcall.Args);

#region 記錄業務日志

//執行方法后記錄正常業務日志,內容來自方法ListBizLog參數
//若要記錄日志,要求該方法必須傳入該參數,且名字必須為ListBizLog,內容為要記錄的業務日志內容
SSY_LOGENTITY tempLog = null;
for (int i = 0; i < mcall.InArgs.Length; i++)
{
if (mcall.GetInArgName(i).ToUpper() == "ListBizLog".ToUpper())
{
List<SSY_LOGENTITY> dictBizLog = mcall.GetInArg(i) as List<SSY_LOGENTITY>;

for (int j = 0; j < dictBizLog.Count; j++)
{
//遍歷記錄業務日志
tempLog = dictBizLog[j] as SSY_LOGENTITY;

//獲取日志控制,確定是否記錄該類日志
if (recordLog.CheckIsRecord(tempLog.DOMAINNAME.ToString(), tempLog.OPTIONNAME.ToString(), distManagerParam))
{
tempLog.LOGID = recordLog.GetID(MakeIDType.YMDHMS_3, string.Empty, null, distManagerParam);

//業務直接使用業務端提交的數據,不在讀取框架環境變量,因為登錄時這部分數據滯后,導致不能記入日志
//tempLog.USERNAMES = USERNAMES;
//tempLog.IPS = IPS;
//tempLog.SYSTEMNAME = SYSTEMNAME;

opList.Add(tempLog);
}
}
if (opList.Count > 0)
{
//記錄日志
bool flag = recordLog.OpBizObjectSingle<SSY_LOGENTITY>(opList, opObjPerporty, opWherePerporty, mainProperty, errStr, distManagerParam);
}
break;
}
}

#endregion

resResult = new ReturnMessage(objRv, mcall.Args, mcall.Args.Length, mcall.LogicalCallContext, mcall);
}
catch (Exception ex)
{
Common.Utility.RecordLog("工廠 Query 模式發生異常!原因" + ex.Message + ex.Source, this.logpathForDebug, this.isLogpathForDebug);

#region 記錄異常日志

if (ex.InnerException != null)
{
//獲取日志控制,確定是否記錄該類日志
if (recordLog.CheckIsRecord("ExceptionErr", "ExceptionErr", distManagerParam))
{
//處理異常類相關信息
string CLASSNAME = mcall.TypeName;
string METHORDNAME = mcall.MethodName;

//異常時這部分可沒有內容
string TABLENAME = "";
string RECORDIDENCOLS = "";
string RECORDIDENCOLSVALUES = "";
string FUNCTIONNAME = "";

logenti = LogCommon.CreateLogDataEnt(LogTypeDomain.ExceptionErr, LogLevelOption.ExecptionErr, recordLog.GetSystemDateTime(distManagerParam),
CLASSNAME, METHORDNAME, LogAction.ExecptionErr, TABLENAME, RECORDIDENCOLS, RECORDIDENCOLSVALUES, USERNAMES, IPS, FUNCTIONNAME,
ex.InnerException.Message, SYSTEMNAME, "");
logenti.LOGID = recordLog.GetID(MakeIDType.YMDHMS_3, string.Empty, null, distManagerParam);

opList.Add(logenti);

if (opList.Count > 0)
{
//記錄日志
bool flag = recordLog.OpBizObjectSingle<SSY_LOGENTITY>(opList, opObjPerporty, opWherePerporty, mainProperty, errStr, distManagerParam);
}
}

resResult = new ReturnMessage(ex.InnerException, mcall);
}

#endregion

resResult = new ReturnMessage(ex, mcall);
}

#endregion
}
else if (distBAC == DistributeActionIden.SingleAction)
{
//數據節點有幾個執行幾次,單次提交,發現執行異常,將異常報告給節點中心,繼續執行,直到完畢
for (int m = 0; m < dataNodes.Count; m++)
{
//ddn.DbFactoryName 數據庫工廠取配置文件,目前不考慮同構不同種類的數據庫
distManagerParam.DistributeDataNode.Connectionstring = string.Format(dataNodes[m].Data_conn, dataNodes[m].Url_addr, dataNodes[m].Data_user,
dataNodes[m].Data_password);
distManagerParam.DistributeDataNode.DbSchema = dataNodes[m].Data_schema;

#region 執行業務方法

try
{
object objRv = mcall.MethodBase.Invoke(this.Target, mcall.Args);

#region 記錄業務日志

//執行方法后記錄正常業務日志,內容來自方法ListBizLog參數
//若要記錄日志,要求該方法必須傳入該參數,且名字必須為ListBizLog,內容為要記錄的業務日志內容
SSY_LOGENTITY tempLog = null;
for (int i = 0; i < mcall.InArgs.Length; i++)
{
if (mcall.GetInArgName(i).ToUpper() == "ListBizLog".ToUpper())
{
List<SSY_LOGENTITY> dictBizLog = mcall.GetInArg(i) as List<SSY_LOGENTITY>;

for (int j = 0; j < dictBizLog.Count; j++)
{
//遍歷記錄業務日志
tempLog = dictBizLog[j] as SSY_LOGENTITY;

//獲取日志控制,確定是否記錄該類日志
if (recordLog.CheckIsRecord(tempLog.DOMAINNAME.ToString(), tempLog.OPTIONNAME.ToString(), distManagerParam))
{
tempLog.LOGID = recordLog.GetID(MakeIDType.YMDHMS_3, string.Empty, null, distManagerParam);

//業務直接使用業務端提交的數據,不在讀取框架環境變量,因為登錄時這部分數據滯后,導致不能記入日志
//tempLog.USERNAMES = USERNAMES;
//tempLog.IPS = IPS;
//tempLog.SYSTEMNAME = SYSTEMNAME;

opList.Add(tempLog);
}
}
if (opList.Count > 0)
{
//記錄日志
bool flag = recordLog.OpBizObjectSingle<SSY_LOGENTITY>(opList, opObjPerporty, opWherePerporty, mainProperty, errStr, distManagerParam);
}
break;
}
}

#endregion

resResult = new ReturnMessage(objRv, mcall.Args, mcall.Args.Length, mcall.LogicalCallContext, mcall);
}
catch (Exception ex)
{
Common.Utility.RecordLog("工廠 SingleAction 模式發生異常!原因" + ex.Message + ex.Source, this.logpathForDebug, this.isLogpathForDebug);

SSY_DATA_ACTION_TASK tempDataTask = null;

#region 記錄異常日志

if (ex.InnerException != null)
{
//獲取日志控制,確定是否記錄該類日志
if (recordLog.CheckIsRecord("ExceptionErr", "ExceptionErr", distManagerParam))
{
//處理異常類相關信息
string CLASSNAME = mcall.TypeName;
string METHORDNAME = mcall.MethodName;

//異常時這部分可沒有內容
string TABLENAME = "";
string RECORDIDENCOLS = "";
string RECORDIDENCOLSVALUES = "";
string FUNCTIONNAME = "";

logenti = LogCommon.CreateLogDataEnt(LogTypeDomain.ExceptionErr, LogLevelOption.ExecptionErr, recordLog.GetSystemDateTime(distManagerParam),
CLASSNAME, METHORDNAME, LogAction.ExecptionErr, TABLENAME, RECORDIDENCOLS, RECORDIDENCOLSVALUES, USERNAMES, IPS, FUNCTIONNAME,
ex.InnerException.Message, SYSTEMNAME, "");
logenti.LOGID = recordLog.GetID(MakeIDType.YMDHMS_3, string.Empty, null, distManagerParam);

opList.Add(logenti);

if (opList.Count > 0)
{
//記錄日志
bool flag = recordLog.OpBizObjectSingle<SSY_LOGENTITY>(opList, opObjPerporty, opWherePerporty, mainProperty, errStr, distManagerParam);
}
}
if (permitSingleDataOperation)
{
#region 獲取失敗操作sql

//獲取失敗記錄,以便將任務報告給節點中心
//獲取操作sql List<DistActionSql> DistriActionSqlParams

for (int task = 0; task < distManagerParam.DistriActionSqlParams.Count; task++)
{
tempDataTask = new SSY_DATA_ACTION_TASK();
tempDataTask.Action_sql = distManagerParam.DistriActionSqlParams[task].ActionSqlText;
string tempSqlParamSeq = string.Empty;
bool temddddd = JsonSerializer.Serialize(distManagerParam.DistriActionSqlParams[task].ActionSqlTextParams, out tempSqlParamSeq);
//保存sql參數序列化結果
tempDataTask.Action_sql_params = tempSqlParamSeq;
tempDataTask.Data_real_conn = ddn.Connectionstring;
data_action_task.Add(tempDataTask);
}
//執行完畢后,清除本次的sql記錄
distManagerParam.DistriActionSqlParams.Clear();

//TODO 報告單點異常給節點中心,暫時不支持,后續擴展
#endregion
}
}

#endregion

continue; //繼續執行
}

#endregion
}
}
else if (distBAC == DistributeActionIden.TransAction)
{
try
{
//分布式事務執行, 按數據節點數量執行,同步提交
using (var ts = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, TimeSpan.FromHours(1)))
{
for (int m = 0; m < dataNodes.Count; m++)
{
//ddn.DbFactoryName 數據庫工廠取配置文件,目前不考慮同構不同種類的數據庫
distManagerParam.DistributeDataNode.Connectionstring = string.Format(dataNodes[m].Data_conn, dataNodes[m].Url_addr, dataNodes[m].Data_user,
dataNodes[m].Data_password);
distManagerParam.DistributeDataNode.DbSchema = dataNodes[m].Data_schema;

#region 執行業務方法

object objRv = mcall.MethodBase.Invoke(this.Target, mcall.Args);

#region 記錄業務日志

//執行方法后記錄正常業務日志,內容來自方法ListBizLog參數
//若要記錄日志,要求該方法必須傳入該參數,且名字必須為ListBizLog,內容為要記錄的業務日志內容
SSY_LOGENTITY tempLog = null;
for (int i = 0; i < mcall.InArgs.Length; i++)
{
if (mcall.GetInArgName(i).ToUpper() == "ListBizLog".ToUpper())
{
List<SSY_LOGENTITY> dictBizLog = mcall.GetInArg(i) as List<SSY_LOGENTITY>;

for (int j = 0; j < dictBizLog.Count; j++)
{
//遍歷記錄業務日志
tempLog = dictBizLog[j] as SSY_LOGENTITY;

//獲取日志控制,確定是否記錄該類日志
if (recordLog.CheckIsRecord(tempLog.DOMAINNAME.ToString(), tempLog.OPTIONNAME.ToString(), distManagerParam))
{
tempLog.LOGID = recordLog.GetID(MakeIDType.YMDHMS_3, string.Empty, null, distManagerParam);

//業務直接使用業務端提交的數據,不在讀取框架環境變量,因為登錄時這部分數據滯后,導致不能記入日志
//tempLog.USERNAMES = USERNAMES;
//tempLog.IPS = IPS;
//tempLog.SYSTEMNAME = SYSTEMNAME;

opList.Add(tempLog);
}
}
//這里事物不能同時記錄日志,需要放到業務方法提交完成后單獨記錄日志
if (opList.Count > 0)
{
//記錄日志
//bool flag = recordLog.OpBizObjectSingle<SSY_LOGENTITY>(opList, opObjPerporty, opWherePerporty, mainProperty, ref errStr, distManagerParam);

}
break;
}
}

#endregion

resResult = new ReturnMessage(objRv, mcall.Args, mcall.Args.Length, mcall.LogicalCallContext, mcall);

#endregion
}

ts.Complete();
ts.Dispose();
}

//恢復事物默認標識
distManagerParam.DistributeActionIden = DistributeActionIden.Query;
//啟用事物日志需要獨立記錄,不能和業務操作混在一個事物里
for (int m = 0; m < dataNodes.Count; m++)
{
//ddn.DbFactoryName 數據庫工廠取配置文件,目前不考慮同構不同種類的數據庫
distManagerParam.DistributeDataNode.Connectionstring = string.Format(dataNodes[m].Data_conn, dataNodes[m].Url_addr, dataNodes[m].Data_user,
dataNodes[m].Data_password);
distManagerParam.DistributeDataNode.DbSchema = dataNodes[m].Data_schema;

if (opList.Count > 0)
{
//記錄日志
bool flag = recordLog.OpBizObjectSingle<SSY_LOGENTITY>(opList, opObjPerporty, opWherePerporty, mainProperty, errStr, distManagerParam);

}
}
}
catch (Exception ex)
{
Common.Utility.RecordLog("工廠 TransAction 模式發生異常!原因" + ex.Message + ex.Source, this.logpathForDebug, this.isLogpathForDebug);
}

}

//最終返回結果
return resResult;
}
}

?

?

獲取實例源碼請入QQ群706224870,在群文件中下載。

轉載于:https://www.cnblogs.com/maotou/p/factory.html

總結

以上是生活随笔為你收集整理的设计模式在实际业务应用中的介绍之2——业务工厂的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

91麻豆精品国产午夜天堂 | 国产一级免费在线 | 久久久国产视频 | 日本性xxxxx 亚洲精品午夜久久久 | 91成版人在线观看入口 | 最近中文字幕在线中文高清版 | 亚洲精品乱码久久久久久久久久 | 久久精品欧美一区二区三区麻豆 | 精品一区二三区 | 91视频3p| 在线精品亚洲 | 蜜臀av网址 | 日韩av一区二区三区四区 | 手机av在线网站 | 最新精品视频在线 | 91成人免费在线视频 | 国产高清久久久 | 成人cosplay福利网站 | 探花视频在线版播放免费观看 | 色视频网页 | 成人三级网站在线观看 | 三级免费黄色 | 在线日本看片免费人成视久网 | 日韩乱码在线 | 2021国产精品视频 | 视频一区在线播放 | 亚洲小视频在线观看 | 99久久精品午夜一区二区小说 | 欧美小视频在线观看 | 久久a视频 | 一区二区三区在线不卡 | 精品久久久精品 | 中文字幕免费高清在线 | 免费午夜视频在线观看 | 97超碰资源 | 麻豆播放| 中文字幕第一页在线vr | 婷婷亚洲综合五月天小说 | 成人高清在线 | 日韩av一卡二卡三卡 | 国产午夜三级 | 在线欧美最极品的av | 999在线视频 | 日日夜夜操av | 欧美精品在线一区 | 99爱视频在线观看 | 国产精品尤物 | 国产精品黑丝在线观看 | 日韩色视频在线观看 | 免费视频你懂得 | 精品黄色在线 | 日日夜夜操av | 久久99久久99精品免费看小说 | 九九九九免费视频 | 黄色毛片视频 | av一区二区三区在线播放 | 99热网站| 中文 一区二区 | 亚洲涩涩涩涩涩涩 | 草莓视频在线观看免费观看 | 成人免费网站视频 | 午夜国产福利在线 | 久久伊人操 | 欧美综合在线视频 | 亚洲午夜不卡 | 欧美 日韩精品 | 欧美久久久久 | 精品视频成人 | 中文字幕在线视频一区二区三区 | 久草在线欧美 | 夜夜操天天操 | 黄色成人毛片 | 一级黄色片在线免费观看 | 国产精品大片免费观看 | 四虎影视久久久 | 欧美日韩国产一区 | 亚洲午夜久久久久久久久 | 国产高清专区 | 玖玖在线视频观看 | av在线电影网站 | 久久se视频 | 青草视频免费观看 | 色婷婷国产精品 | 国产日韩精品一区二区在线观看播放 | 少妇bbbb搡bbbb搡bbbb | 成人资源在线观看 | 国产高清区 | 97超在线| 色婷婷av在线 | 国产伦精品一区二区三区无广告 | 97精品国产97久久久久久久久久久久 | 激情五月色播五月 | 日韩网站视频 | 日韩在线高清 | 久久久久久久久久亚洲精品 | 在线观看91精品国产网站 | 国产成人综合图片 | 国产精品毛片久久久 | 日韩免费三级 | 成年人在线观看免费视频 | 天天爽天天做 | 97国产小视频 | 国产91学生粉嫩喷水 | 精品国产一区二区在线 | 国产精品久久久久av免费 | 成人免费视频播放 | 天天做天天爱天天综合网 | 在线观看黄色的网站 | 国产成人一二三 | 麻花豆传媒一二三产区 | 天天综合入口 | 亚洲jizzjizz日本少妇 | 欧美 日韩 性 | 久久国产精品一国产精品 | 国产精品24小时在线观看 | 婷婷久久婷婷 | 成年人在线看视频 | 96精品视频| 色天堂在线视频 | 973理论片235影院9 | 日本中文字幕网 | 国产精品美女久久久免费 | 国产日韩欧美视频 | 国产无遮挡猛进猛出免费软件 | 美女黄久久 | 天天综合网在线观看 | 不卡精品 | 亚洲经典在线 | 韩国一区视频 | 国产中文在线视频 | 亚洲一区二区精品视频 | 久草在线资源网 | 国产精品高潮呻吟久久久久 | 日韩女同一区二区三区在线观看 | 手机成人在线电影 | 欧美,日韩| 欧美激情第一页xxx 午夜性福利 | 又黄又爽又色无遮挡免费 | 在线观看视频免费播放 | 网站免费黄 | 天天干天天干天天色 | 久久国产精品免费观看 | 欧美色噜噜 | 亚洲经典在线 | 五月天婷婷综合 | 欧美日韩在线观看一区二区三区 | 综合久久网站 | 最新日韩精品 | 精品国产乱码久久久久久浪潮 | 高清在线一区 | 国产精品理论片在线播放 | 亚洲日本欧美在线 | 亚洲精品国偷自产在线91正片 | 国产精品正在播放 | 四虎在线免费观看 | 五月婷婷丁香六月 | 岛国一区在线 | 婷婷久久丁香 | 国产黄色播放 | 久久经典国产视频 | 婷婷中文字幕综合 | 久久在线观看视频 | 亚洲黄色在线观看 | 91在线播放国产 | 日韩在线免费看 | 精品女同一区二区三区在线观看 | 日本性xxxxx 亚洲精品午夜久久久 | 99热在线观看 | 国产精品尤物视频 | 午夜av影院| 久久久精品国产一区二区电影四季 | 一区二区在线影院 | 国产精品久久伊人 | 国产一级二级在线观看 | 丁香婷婷色综合亚洲电影 | 91色一区二区三区 | 91私密保健| 欧美性生爱 | 狠狠色丁香久久婷婷综合丁香 | 亚洲高清在线视频 | 麻豆视传媒官网免费观看 | 麻豆传媒视频观看 | 国产99中文字幕 | 亚州天堂| 日本精品久久久一区二区三区 | 98超碰在线观看 | 91亚·色| 欧美成a人片在线观看久 | 国产96在线视频 | 欧美aa一级片 | 久久精品小视频 | 欧美色精品天天在线观看视频 | 深夜免费网站 | av观看免费在线 | av中文字幕日韩 | 国产欧美综合视频 | 69视频在线播放 | 亚洲成人午夜在线 | 992tv在线成人免费观看 | 国产日韩视频在线观看 | 日日干夜夜操视频 | 亚洲精品久久久久中文字幕m男 | 国产成人精品一区二区 | 久久成人国产精品 | 国产精品九九九九九九 | 韩国在线视频一区 | 久久免费大片 | 草在线 | 久久香蕉电影网 | 日韩精品欧美专区 | 亚洲成av人电影 | 最新国产福利 | 成人黄色视 | 91视频免费网址 | 国产精品青草综合久久久久99 | www.国产在线观看 | 91九色最新地址 | 亚洲福利精品 | 91在线免费播放视频 | 国产一区二区高清不卡 | 天天天天天天干 | 久久久久免费看 | 色婷婷综合久久久中文字幕 | 成人a级网站 | 国产精品国产亚洲精品看不卡15 | 69av久久| 国产69久久精品成人看 | 国产99在线免费 | 正在播放 久久 | 黄网站污| 亚洲一二区精品 | 夜夜操天天干 | 国产精久久久久久久 | 久草视频在线资源站 | 免费网址在线播放 | 好看的国产精品视频 | 日本大尺码专区mv | 午夜黄色一级片 | 亚洲精品小视频 | 国产精品综合久久 | 最近中文字幕在线播放 | 婷婷精品国产一区二区三区日韩 | 日韩免费在线视频 | 婷婷激情5月天 | 五月激情久久 | 激情久久综合网 | 在线国产视频观看 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 美女视频黄频 | 手机成人在线 | 成人午夜精品久久久久久久3d | 国产亚洲成人精品 | 国产精彩视频一区二区 | 国产九九精品视频 | 国产精品毛片一区视频播 | 成人高清在线观看 | 国产成人一区二区三区电影 | 91香蕉视频黄色 | 午夜精品视频一区 | 午夜精品视频一区 | 91刺激视频 | 久久兔费看a级 | 国产一级电影在线 | 91精品国产麻豆国产自产影视 | 欧美综合在线视频 | 在线亚洲成人 | 91高清视频在线 | 日韩大片在线播放 | 福利区在线观看 | 成人av手机在线 | 亚洲精品av中文字幕在线在线 | 国产一区二区在线播放视频 | 国产一区二区三区视频在线 | 久久久久久电影 | 亚洲www天堂com | 国产成人av电影在线观看 | 国产精品视频在线观看 | 99视频这里有精品 | 免费人成网ww44kk44 | 五月天精品视频 | 国产正在播放 | av综合 日韩 | 国产精品嫩草55av | 免费av大全 | 久久香蕉一区 | 免费三及片 | 免费精品人在线二线三线 | 亚洲日韩中文字幕 | 97超碰伊人 | 日韩3区 | 日韩色av色资源 | 国产亚洲欧美精品久久久久久 | japanesefreesex中国少妇 | 亚洲综合黄色 | 中文字幕在线观看完整版电影 | 视频二区在线视频 | 国产精品尤物 | 日韩羞羞 | 国产精品大片免费观看 | 不卡国产视频 | 中文字幕在线视频一区二区三区 | 欧美色图亚洲图片 | 三三级黄色片之日韩 | 久久综合丁香 | 91激情视频在线观看 | 精品国产视频一区 | 免费美女av | 亚洲精品视频偷拍 | 欧美日韩精品影院 | 天天射天天干天天操 | 不卡在线一区 | 伊人色**天天综合婷婷 | 五月天丁香亚洲 | 天天天射 | www黄| 久久69精品久久久久久久电影好 | 久久精品a | 亚洲伦理电影在线 | 国产尤物在线视频 | 天天干婷婷 | 欧美激情在线看 | 一级特黄av | 97视频久久久 | 成人欧美一区二区三区黑人麻豆 | 免费观看成人av | 国产日本亚洲高清 | 麻豆视频免费入口 | 亚洲毛片视频 | 91在线精品观看 | 久久久18 | 黄色成人小视频 | 欧美日韩国产精品一区二区亚洲 | 国产精品综合在线 | 四虎影视精品永久在线观看 | 久久怡红院 | 麻豆视频在线看 | 在线观看免费av网站 | 亚洲精品99久久久久久 | 欧美在线aa | 亚洲理论片在线观看 | 日韩在线免费电影 | 亚洲精品乱码久久久久久写真 | 久久激情综合网 | 国产精品毛片一区二区在线看 | 99免费| 米奇影视7777 | 怡红院av久久久久久久 | 九九视频这里只有精品 | 亚洲精品乱码久久久久久9色 | 亚洲成人免费在线 | 成人电影毛片 | 亚洲精品在线观看中文字幕 | 96超碰在线| 欧美在线1区 | 亚洲男女精品 | 国产一级电影免费观看 | 国产精品综合在线观看 | 亚洲影院国产 | 天天狠狠干 | 探花视频在线观看免费 | 在线视频国产区 | 三级在线视频观看 | 久草精品视频在线播放 | 国产精品自产拍在线观看网站 | 人人澡人摸人人添学生av | 欧美精品一二三 | 欧美极品裸体 | 中文字幕 91| 97超碰在线免费 | 看全黄大色黄大片 | 成人久久18免费网站麻豆 | 日本精品午夜 | 天天干亚洲 | 日韩黄色一级电影 | av免费网站观看 | 色网站在线看 | 中文字幕日本电影 | 国产亚洲日本 | 天天色天天射综合网 | 久久久久久免费毛片精品 | 国内精品久久久久久久影视麻豆 | 亚洲在线免费视频 | 日日操日日干 | 国产91成人 | 亚洲国产精品电影 | 国产在线欧美日韩 | 天天综合视频在线观看 | 六月婷色 | 欧美片网站yy | 亚洲精品www久久久久久 | 精品视频久久 | 一级淫片在线观看 | 国模吧一区 | 成人免费观看av | 亚洲成aⅴ人片久久青草影院 | 国产黄色片免费看 | 中文字幕国产在线 | 美女国产 | 在线观看精品一区 | 中文字幕欧美日韩va免费视频 | 久久婷婷国产色一区二区三区 | 精品国产电影一区 | 亚洲视频精品在线 | 激情在线网址 | 久久精品国产久精国产 | 亚洲成人精品久久 | 永久免费观看视频 | 亚洲精品日韩一区二区电影 | 日本三级中文字幕在线观看 | 日韩三级视频在线观看 | 毛片在线网 | 国产97碰免费视频 | 丰满少妇一级片 | 久久九九久久九九 | 国产96精品 | 精品在线视频观看 | 在线97 | 波多野结衣久久精品 | 久久久久五月天 | 成人永久视频 | 国产明星视频三级a三级点| 91丨九色丨91啦蝌蚪老版 | 国产最新视频在线观看 | 久久a免费视频 | 成年人视频在线观看免费 | 精品久久久久久亚洲 | 免费欧美精品 | 又黄又爽又无遮挡的视频 | 亚洲欧美日韩一区二区三区在线观看 | 精品99久久久久久 | 黄色的网站在线 | av中文国产 | 国产精品精品国产婷婷这里av | 狠狠色丁婷婷日日 | 久久午夜色播影院免费高清 | 视频国产在线观看18 | 91自拍视频在线 | 欧美精品一区二区三区四区在线 | 91精品国产三级a在线观看 | 久久久久免费观看 | 欧美成人精品三级在线观看播放 | 精品久久久久久亚洲 | 国产在线不卡一区 | 日韩高清国产精品 | 国产一级片不卡 | 国产福利资源 | 人人爽人人爽人人爽人人爽 | 天天综合网~永久入口 | av天天澡天天爽天天av | 国产精品刺激对白麻豆99 | 片网站| 美女视频黄免费网站 | 成人黄色影片在线 | 久久久久日本精品一区二区三区 | 国产一线天在线观看 | 亚洲 欧洲av | 人人躁 | 欧美日韩视频在线观看免费 | 玖玖爱免费视频 | 成人h在线播放 | 午夜精品一二区 | 日韩系列在线观看 | 色婷婷福利 | 欧美人人 | 亚洲欧洲av | 国产一区在线观看免费 | 久久99精品视频 | 91av电影在线 | av电影免费在线看 | 超碰公开在线观看 | 黄色app网站在线观看 | 射久久久 | 成人午夜久久 | 久久成人综合视频 | 久久av免费| 日韩精品在线视频 | 在线看av网址 | 日日夜夜精品网站 | 久久a久久 | 91视频免费国产 | 成人免费在线电影 | 国产黄影院色大全免费 | 国产精久久久久久妇女av | 久久免费激情视频 | 最新中文字幕在线观看视频 | 国产美女黄网站免费 | 久久久国际精品 | 久久综合导航 | 91爱爱网址| 亚洲激色| 日韩免费一级a毛片在线播放一级 | av片在线观看 | 悠悠av资源片 | 激情五月婷婷综合 | 在线观看视频97 | 久久综合色综合88 | 婷婷午夜 | 天天草天天草 | 欧美日韩在线免费观看 | 国产精品影音先锋 | 日韩三级视频在线观看 | 日韩中文字幕91 | 亚洲男男gaygay无套 | 91精品一区二区三区蜜桃 | 色综合久久中文字幕综合网 | 国产高清网站 | 日日碰狠狠躁久久躁综合网 | 国产精品久久久亚洲 | 五月婷婷丁香六月 | 免费久久久久久 | 久艹视频免费观看 | 久久国内精品99久久6app | 91丨九色丨蝌蚪丨老版 | 婷婷开心久久网 | 精品欧美一区二区精品久久 | 成人精品电影 | 日韩av不卡在线播放 | 午夜成人影视 | 午夜精品一区二区三区四区 | 伊人影院99 | 久久精品99精品国产香蕉 | 在线观看视频一区二区三区 | 色综合久久88 | 欧美日韩国产一二 | 国产精品乱码久久 | zzijzzij日本成熟少妇 | 999在线视频 | 五月婷婷深开心 | 91亚洲视频在线观看 | 久久成人18免费网站 | 午夜精品久久久久久99热明星 | 中文字幕制服丝袜av久久 | 日本精品一区二区在线观看 | 日韩www在线 | 久久久久一区 | 最近av在线| 久久极品 | 美女黄频网站 | av电影亚洲 | 波多野结衣一区 | 免费网站在线 | 91精品播放| 久久综合欧美精品亚洲一区 | 天天干com | 黄色性av| 亚洲jizzjizz日本少妇 | 中文字幕中文字幕 | 国产精品久久久久免费 | 亚洲精品久久久久www | 久久成人毛片 | 国产一级不卡毛片 | 色成人亚洲网 | 久久伊人免费视频 | 久草久热 | 午夜在线免费观看视频 | 免费观看一级特黄欧美大片 | 韩国av一区 | 国产不卡视频在线播放 | 500部大龄熟乱视频 欧美日本三级 | 久草色在线观看 | 欧美一二三在线 | 日韩影视在线观看 | 成年人电影免费在线观看 | av黄色在线观看 | 日韩在线观看小视频 | 久久成人国产精品免费软件 | 久草精品在线播放 | 欧美日韩一区二区三区视频 | 黄色影院在线免费观看 | 少妇资源站 | 中文字幕色婷婷在线视频 | 天天爽夜夜爽精品视频婷婷 | 国产精品毛片一区二区三区 | 精品一区二区三区久久久 | www.av小说 | 亚洲人天堂 | 国产91精品高清一区二区三区 | 久久在线免费观看视频 | 99久久国产免费,99久久国产免费大片 | 五月婷婷综合在线视频 | 黄色的视频 | 黄色成人av | 99久免费精品视频在线观看 | 天天插伊人| 男女视频91 | 国内精品小视频 | 伊人久久国产精品 | 国产在线播放一区 | 成人av资源网 | 在线91色 | 久久草在线精品 | 日韩在线免费高清视频 | 日日操日日 | 亚洲免费精品一区二区 | 国产成人精品综合久久久 | 国产99久久久精品 | 久草香蕉在线视频 | 成人国产精品电影 | 久久精品二区 | 午夜黄色影院 | 国产精品一区二区免费在线观看 | 成人免费观看完整版电影 | 又黄又刺激的视频 | 久久福利剧场 | 久久久久成 | 久久久精品视频成人 | 在线观看久久久久久 | 国际av在线 | 日韩视频一二三区 | 成人一级片在线观看 | 一区二区三区在线免费观看视频 | 国产精品九九热 | 99久久夜色精品国产亚洲96 | 久久99热这里只有精品 | 色老板在线视频 | 91精品国产91p65 | 综合精品在线 | 人人舔人人射 | 精品在线观看视频 | 日三级在线 | 久久久久久久久免费视频 | 天天人人| 超碰97.com| 在线看黄色的网站 | 国产自在线观看 | 亚洲国产成人av网 | 日韩精品你懂的 | 狠狠干网站| 国产日产亚洲精华av | 色婷婷狠狠18 | 91在线91| 久久久久免费看 | 欧美激情综合五月色丁香小说 | 亚洲影视九九影院在线观看 | 亚洲国产人午在线一二区 | 亚州av网站 | 欧美日本在线视频 | 免费一级特黄录像 | 一区二区三区污 | 国产精品成人一区二区三区 | 免费的黄色av | 97在线看| 国产在线播放一区二区三区 | 成人手机在线视频 | 国产精品久久久久久久久久久久 | 久久国内精品视频 | 四川bbb搡bbb爽爽视频 | 亚洲欧美成人综合 | bbw av| 久久精品电影院 | 色中射 | 97福利在线观看 | 久久精品牌麻豆国产大山 | 97高清免费视频 | 五月婷综合 | 永久免费精品视频网站 | 国产99在线免费 | 最新国产在线 | 亚洲国产69| 国产欧美最新羞羞视频在线观看 | 国产一区电影在线观看 | 久久艹在线 | 久久精品一二三区 | 在线观看黄色 | 国内精品免费久久影院 | 色姑娘综合天天 | 五月综合激情网 | 一级做a视频 | 成人全视频免费观看在线看 | 国产乱码精品一区二区三区介绍 | 99爱精品视频 | 国产视频在 | 最新av电影网址 | 成人黄色毛片 | 国内精品亚洲 | 91大片网站 | 日本在线观看一区二区三区 | 国产无吗一区二区三区在线欢 | 亚洲精品66 | 免费黄色在线 | 国产福利在线不卡 | 国产一级二级av | 欧美少妇bbwhd | 奇米777777 | a级黄色片视频 | 中文字幕在线观看三区 | av日韩在线网站 | www久| 高清av免费看 | 日韩免费看| 99久久精品国产系列 | 中文字幕免费观看全部电影 | 婷婷草| 精品色综合 | 免费观看国产精品视频 | 一级黄色免费 | 久久精品之 | 成人av免费在线播放 | 国产精品手机看片 | 99免费看片 | 国产精品久久久久四虎 | 久久97精品 | 色偷偷88888欧美精品久久久 | 特级西西444www大胆高清无视频 | 色激情五月 | 久久久久国产精品厨房 | 免费看片日韩 | 伊人夜夜| 精品无人国产偷自产在线 | 午夜av免费看 | 久久人人爽 | 国产精品久久久久久99 | 久久免费av电影 | 天天综合网久久综合网 | 久久精彩视频 | 国产中文字幕亚洲 | 狠狠干夜夜爱 | 91超碰免费在线 | 国产福利不卡视频 | 在线免费观看黄 | 五月婷婷婷婷婷 | 六月激情婷婷 | 久久精品牌麻豆国产大山 | 国产97色在线 | 91精品国产99久久久久久久 | 三级av网站 | 亚洲精品久久久久久久不卡四虎 | 国产在线不卡精品 | 久久99在线视频 | 欧美日本国产在线观看 | 在线免费av网 | 黄色成人av在线 | 久久久久免费精品国产小说色大师 | 日韩精品一区二区在线观看 | 免费亚洲成人 | 97日日碰人人模人人澡分享吧 | 日日夜夜人人精品 | 日韩有码欧美 | 久久久免费看 | 丁香婷婷久久 | 欧美va电影 | 500部大龄熟乱视频 欧美日本三级 | 三级毛片视频 | 欧美一级特黄高清视频 | 精品五月天 | 久久优| 麻豆精品视频在线 | 91精品国产综合久久福利不卡 | 国产精品国内免费一区二区三区 | 欧美一级电影免费观看 | 亚洲高清在线视频 | 黄色的视频网站 | 国产 欧美 日本 | 日本视频网| 黄色一区三区 | 天堂av免费观看 | 亚洲一区二区视频在线播放 | 国产精品久久久久一区二区三区共 | 91大片成人网 | 99热手机在线 | 国产高清亚洲 | 亚洲女人天堂成人av在线 | 亚洲乱码一区 | 99国产在线视频 | 日韩国产精品久久 | 亚洲第一香蕉视频 | 日韩av中文在线 | 99精彩视频在线观看免费 | 国内精品国产三级国产aⅴ久 | 国产五月天婷婷 | 亚洲综合涩 | 最新超碰 | 久久黄色影视 | 日韩欧美高清在线 | 日日夜夜网 | 欧美日韩在线网站 | 婷婷色中文网 | 麻豆免费精品视频 | 日韩www在线 | 久久综合久久综合九色 | 美女视频黄网站 | 最近中文字幕大全中文字幕免费 | 精选久久| 色美女在线 | 天天草av | 天天操天天干天天爽 | 亚洲国产成人久久综合 | 国产成人一二片 | 欧美精品午夜 | 在线观看日韩免费视频 | 日韩理论片 | 在线观看免费国产小视频 | 最新日本中文字幕 | 国产精品久久久久久久99 | 精品亚洲一区二区三区 | 91女神的呻吟细腰翘臀美女 | 日韩理论在线播放 | 婷婷综合在线 | 中文字幕在线免费观看视频 | av中文字幕网站 | 久久久久美女 | 欧美久久久久久久久久久 | www.福利视频 | 欧美久久久久久久久久 | 97超碰精品 | 狠狠狠狠狠狠天天爱 | 亚洲v欧美v国产v在线观看 | 三级动图| 黄色a视频 | 激情网站免费观看 | 在线视频观看成人 | 91漂亮少妇露脸在线播放 | 天天射天天干天天 | 国产成人一区二区三区免费看 | 日日摸日日爽 | 亚洲mv大片欧洲mv大片免费 | 亚洲成人动漫在线观看 | 在线亚洲人成电影网站色www | 婷婷视频在线播放 | 最新免费中文字幕 | 中文字幕亚洲综合久久五月天色无吗'' | 99色在线| 亚洲v精品 | av电影一区二区三区 | 在线色吧| 99精品黄色片免费大全 | 四虎国产精品免费 | 国产91精品久久久久久 | 国产亚洲日本 | 在线观看www. | 色中色综合 | 欧美国产亚洲精品久久久8v | 日韩免费久久 | 国产原创在线 | 国产精品激情偷乱一区二区∴ | 欧美精品久久久久a | 欧美成人手机版 | 国产高h视频| 久久好看免费视频 | 久久午夜影院 | 日日噜噜噜噜夜夜爽亚洲精品 | 日韩二区在线观看 | 91久久久久久久 | 久久精品久久精品 | 国产高清视频在线播放 | 久久96国产精品久久99软件 | www夜夜操| 国产第一页在线观看 | 在线电影 一区 | 欧美一区二区三区不卡 | 91女人18片女毛片60分钟 | www.888.av| 免费日韩av片 | 高清在线一区二区 | 国产永久网站 | 亚洲在线日韩 | 国产色 在线 | 国产99久| 久久精品国产精品亚洲精品 | 久久精选 | 伊人国产在线播放 | 国产精品自产拍在线观看中文 | 日韩av在线免费播放 | 久久一级电影 | 亚洲婷婷伊人 | 国产美女主播精品一区二区三区 | 精品久久99 | 免费日韩一区 | 国产一区视频在线播放 | 97超碰国产精品女人人人爽 | 九草视频在线 | 777视频在线观看 | 亚洲区视频在线 | 香蕉视频最新网址 | 福利视频入口 | 欧美aaa一级 | 国产免费嫩草影院 | 蜜臀av夜夜澡人人爽人人桃色 | 91精品久久久久久综合乱菊 | 久久久精品视频网站 | av 在线观看| 精品产品国产在线不卡 | 免费观看十分钟 | 久久美女精品 | 色网站在线 | 免费能看的黄色片 | 天天干天天操天天干 | 97电影在线看视频 | 精品国产三级 | 天天干夜夜夜操天 | 久久人人爽人人片 | 伊人伊成久久人综合网站 | 日本精品在线看 | 激情综合五月天 | 色wwww| 久草在线免费看视频 | 狠狠色丁香婷婷综合最新地址 | 黄色小说免费在线观看 | 久久精品牌麻豆国产大山 | 高清中文字幕av | 久久精品国产亚洲aⅴ | 欧美九九九 | 久久一区精品 | 天天操天天干天天操天天干 | 国产精品va最新国产精品视频 | 波多野结衣电影一区二区三区 | 亚洲精品视频在线免费 | 国产精品12 | 成人在线视频免费看 | 日韩久久午夜一级啪啪 | 婷婷成人综合 | 欧美性大战久久久久 | 亚洲高清不卡av | 亚洲 欧美 综合 在线 精品 | 手机成人在线 | 91桃色在线播放 | 97狠狠干| 天天爽天天碰狠狠添 | 黄色国产在线观看 | 在线观看色网 | 五月天婷婷视频 | 99视 | 亚洲一区网站 | 999视频在线播放 | 久久久久久久久毛片精品 | 成人a v视频 | 成人性生交视频 | 99视频在线观看一区三区 | 久久在线观看视频 | 一 级 黄 色 片免费看的 | 日韩在线免费电影 | 国内久久视频 | 亚洲精品国产精品国自产观看 | 日韩免费大片 | 国产午夜一级毛片 | 亚洲国产精品999 | 久久精品一| 97视频在线免费播放 | 狠狠色婷婷丁香六月 | 国产精品扒开做爽爽的视频 | 最新国产在线 | 日韩夜夜爽| 黄网站app在线观看免费视频 | 久草视频免费在线播放 | 亚洲日本三级 | 91在线免费看片 | 色悠悠久久综合 | 黄色小说18| 亚洲视频999| 91插插插免费视频 | 玖玖爱免费视频 | 日日添夜夜添 | 中文字幕在线免费观看 | av高清网站在线观看 | 中文字幕在线看 | 在线观看视频日韩 | 四月婷婷在线观看 | 免费a级毛片在线看 | 丁香花在线观看视频在线 | 久久亚洲福利视频 | 成人av免费看 | 日韩中文字幕免费视频 | 亚洲狠狠操 | 99免费看片| 在线观看网站黄 | 国产黄色播放 | 久久综合狠狠综合久久狠狠色综合 | 国产一区精品在线 | 麻豆视频在线免费观看 | 欧美日韩免费一区二区三区 | 欧美一区二区伦理片 | 久草视频在线免费 | 黄色a一级视频 | 国产成人三级三级三级97 | 91人人爱| 欧美日韩久久久 | 午夜精品电影一区二区在线 | 99久久综合狠狠综合久久 | 婷婷黄色片 | 爱干视频 | 日韩性xxxx | 国产精品国产精品 | 欧美日韩在线视频观看 | wwwww.国产 | 黄色在线观看免费网站 | 色婷婷综合久久久中文字幕 | 精品一区在线 | 欧美成人999 | 国产精品自产拍在线观看桃花 | 99久久电影 | 欧美日一级片 | 日韩欧美黄色网址 | 国产精品视频地址 | av一级免费 | 久草线 | 成年人电影毛片 | 婷婷黄色片 | 久久精品男人的天堂 |