走向.NET架构设计—第五章—业务层模式,原则,实践(后篇)
本篇的议题如下:架构模式设计模式设计原则
代码
{
bool CanShip(Order Order);
void Ship(Order Order);
bool CanCancel(Order Order);
void Cancel(Order order);
OrderStatus Status { get ; }
}
{
New = 0 ,
Shipped = 1 ,
Canceled = 2
}
代码
{
private IOrderState _orderState;
public Order(IOrderState baseState)
{
_orderState = baseState;
}
public int Id { get ; set ; }
public string Customer { get ; set ; }
public DateTime OrderedDate { get ; set ; }
public OrderStatus Status()
{
return _orderState.Status;
}
public bool CanCancel()
{
return _orderState.CanCancel( this );
}
public void Cancel()
{
if (CanCancel())
_orderState.Cancel( this );
}
public bool CanShip()
{
return _orderState.CanShip( this );
}
public void Ship()
{
if (CanShip())
_orderState.Ship( this );
}
internal void Change(IOrderState OrderState)
{
_orderState = OrderState;
}
}
代码
public void ChangeStatus()
{
switch (Status)
{
case OrderStatus.New:
// .... do some things
break ;
case OrderStatus.Shipped:
// .... do some things
break ;
case OrderStatus.Canceled:
// .... do some things
break ;
}
}
代码
{
public bool CanShip(Order Order)
{
return true ;
}
public void Ship(Order Order)
{
Order.Change( new OrderShippedState());
}
public OrderStatus Status
{
get { return OrderStatus.New; }
}
public bool CanCancel(Order Order)
{
return true ;
}
public void Cancel(Order order)
{
order.Change( new OrderCanceledState());
}
public new Order(OrderNewState newStatus);
}
代码
{
public bool CanShip(Order order)
{
return false ;
}
public void Ship(Order order)
{
throw new NotImplementedException( " You can't ship a shipped order! " );
}
public OrderStatus Status
{
get { return OrderStatus.Shipped; }
}
public bool CanCancel(Order Order)
{
return false ;
}
public void Cancel(Order order)
{
throw new NotImplementedException( " You can't ship a shipped order! " );
}
}
代码
{
public bool CanShip(Order Order)
{
return false ;
}
public void Ship(Order Order)
{
throw new NotImplementedException( " You can't ship a cancelled order! " );
}
public OrderStatus Status
{
get { return OrderStatus.Canceled; }
}
public bool CanCancel(Order Order)
{
return false ;
}
public void Cancel(Order order)
{
throw new NotImplementedException( " You can't ship a cancelled order! " );
}
}
代码
{
private T _Id;
private bool _idHasBeenSet = false ;
private IList < string > _brokenRules = new List < string > ();
public EntityBase()
{ }
public EntityBase(T Id)
{
this .Id = Id;
}
public T Id
{
get { return _Id; }
set
{
if (_idHasBeenSet)
ThrowExceptionIfOverwritingAnId();
_Id = value;
_idHasBeenSet = true ;
}
}
private void ThrowExceptionIfOverwritingAnId()
{
throw new ApplicationException( " You cannot change the id of an entity. " );
}
public bool IsValid()
{
ClearCollectionOfBrokenRules();
CheckForBrokenRules();
return _brokenRules.Count() == 0 ;
}
protected abstract void CheckForBrokenRules();
private void ClearCollectionOfBrokenRules()
{
_brokenRules.Clear();
}
public IEnumerable < string > GetBrokenBusinessRules()
{
return _brokenRules;
}
protected void AddBrokenRule( string brokenRule)
{
_brokenRules.Add(brokenRule);
}
}
代码
{
public Customer() { }
public Customer( long Id)
: base (Id)
{ }
public string FirstName { get ; set ; }
public string LastName { get ; set ; }
protected override void CheckForBrokenRules()
{
if (String.IsNullOrEmpty(FirstName))
base .AddBrokenRule( " You must supply a first name. " );
if (String.IsNullOrEmpty(LastName))
base .AddBrokenRule( " You must supply a last name. " );
}
}