CommandBase用来建立一个命令对象,就是执行一个批处理的命令来完成一个业务逻辑。它可以运行在客户端和服务器端。UI可以直接调用Command对象的方法。书中给的使用例子为判定业务对象是否存在,只有单一的功能。我为了把和此业务对象有关的所有操作都放到此类中,可能的操作有,根据属性判定业务对象是否存在、删除业务对象前的数据完整性检查、成批更新业务对象集合等。为此我采用了和ReadOnlyListBase相同的方法,增加一个操作类型,在调用参数中使用ReadOnlyBase的业务对象,这样可以传递尽可能多的参数,如果参数超出这个范围,你在特殊处理参数的传递和状态结果的返回。状态结果的返回采用公开多个属性的方式来实现。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Csla;
using Csla.Data;
using Csla.Security;
using Csla.Validation;
using CAC.SysPrivilege.DAL;
using CAC.SysPrivilege.DAL.DTO;
namespace CAC.SysPrivilege.BusinessLibrary
{
[Serializable()]
public class SHOP_INFOCmd : CommandBase
{
/// <summary>
/// 操作类型枚举定义
/// </summary>
private enum OperationType { Exists, DeleteCheck };
private OperationType _operationType;
private string _message;
private bool _exists;
private SHOP_INFOInfo _shopInfo;
/// <summary>
/// 传入操作类型,和必要的参数,采用业务对象来做参数,根据不同的操作类型来使用业务对象的不同属性
/// </summary>
/// <param name="operationType"></param>
/// <param name="shopInfo"></param>
private SHOP_INFOCmd(OperationType operationType,SHOP_INFOInfo shopInfo)
{
_operationType = operationType;
_shopInfo = shopInfo;
}
/// <summary>
/// 对象公开的属性,只有在对应的方法调用后,访问这些属性才会有实际意义
/// </summary>
public bool ShopInfoExists
{
get { return _exists; }
}
public string Message
{
get{return _message;}
}
#region Static 对外公开的方法
/// <summary>
/// 指定的单位代码是否存在
/// </summary>
/// <param name="shopId"></param>
/// <returns></returns>
public static bool Exists(string shopId)
{
//调用 DataPortal.Execute数据访问门户,先构造一个SHOP_INFOCmd对象,SHOP_INFOCmd对象需要操作类型和SHOP_INFOInfo对象
var shop = DataPortal.Execute<SHOP_INFOCmd>(new SHOP_INFOCmd(OperationType.Exists,new SHOP_INFOInfo() { SHOP_ID = shopId }));
return shop.ShopInfoExists;
}
/// <summary>
/// 删除单位前的数据检查
/// </summary>
/// <param name="shopId"></param>
/// <returns></returns>
public static string DeleteCheck(string shopId)
{
var shop = DataPortal.Execute<SHOP_INFOCmd>(new SHOP_INFOCmd(OperationType.DeleteCheck,new SHOP_INFOInfo() { SHOP_ID = shopId }));
return shop.Message;
}
#endregion
/// <summary>
/// 具体实现是否存在的方法
/// </summary>
private void _CheckExists()
{
var dal = new SHOP_INFODal();
_exists = dal.Exists(_shopInfo.SHOP_ID);
}
private void _DeleteCheck()
{
var dal = new SHOP_INFODal();
_message = dal.DeleteCheck(_shopInfo.SHOP_ID);
}
#region DataPortal_Execute
/// <summary>
/// 数据访问门户,根据不同的操作类型_operationType和分发方法
/// </summary>
protected override void DataPortal_Execute()
{
switch (_operationType)
{
case OperationType.Exists:
_CheckExists();
break;
case OperationType.DeleteCheck:
_DeleteCheck();
break;
default:
break;
}
}
#endregion
}
}
测试代码:
if (SHOP_INFOCmd.Exists(collection["SHOP_ID"]))
{
ViewData.ModelState.AddModelError("SHOP_ID1", "单位代码:" + collection["SHOP_ID"] + "已经存在,不能增加");
return ShopInfoCreate();
}