Идея такого подхода заключается в том, что Order содержит только информацию, необходимую для заказа (orderID, цена и т. д.), и отделен от логики того, как его сохранить, за что отвечает Служба. (Может случиться так, что один IOrderService сохраняет в SQL, а другой в текстовый файл, например, и в этом случае этот шаблон также необходим для принципа открытости/закрытости).
Если, однако, мы хотим сохранить заказ (или проверить заказ может иметь больше смысла в этом контексте) только один раз за время существования экземпляра, то, похоже, нам нужен флаг isValidated, чтобы жить в заказе, чтобы мы могли прочитать order.IsValidated, чтобы увидеть, нужно ли нам его сохранить или нет.
Пример реализации того, как, по моему мнению, это следует сделать, приведен ниже:
Код: Выделить всё
public interface IOrder
{
int OrderID { get; }
int NumberOfPieces { get; }
bool IsValidated { get; }
}
public interface IValidate
{
void SetValidated();
}
public class Order : IOrder, IValidate
{
public int OrderID { get; private set; }
public int NumberOfPieces { get; private set; }
private bool _isValidated = false;
public bool IsValidated
{
get { return _isValidated; }
private set { _isValidated = value; }
}
public void SetValidated()
{
_isValidated = true;
}
}
public interface IOrderService
{
void Validate(IOrder order);
}
public class OrderService : IOrderService
{
public void Validate(IOrder order)
{
if (order is IValidate v)
{
DoValidateWork(order);
v.SetValidated();
}
}
private bool DoValidateWork(IOrder order)
{
//validation logic
return true;
}
}
Есть ли способ инкапсулировать флаг isValidated, чтобы только OrderService мог его обновлять?>
Подробнее здесь: https://stackoverflow.com/questions/798 ... ngle-respo
Мобильная версия