Я пытаюсь реорганизовать чудовищную службу WCF во что-то более управляемое. На момент написания этой статьи служба занимает около 9 зависимостей через конструктор, что делает модульное тестирование очень сложным.
Служба обрабатывает локальное состояние через конечный автомат, выполняет проверку параметров, выдает исключения, выполняет фактическую операцию и запускает события публикации через паб/дополнительный канал. Этот код очень похож на все остальные вызовы службы.
Я понимаю, что я могу сделать несколько из этих вещей (подтверждение аргумента, паб/вспомогательные уведомления) по-другому, возможно через Аспектно-ориентированное программирование или Поведение WCF, но моя внутренность говорит мне, что общий подход ошибочен - это слишком "процедурно".
Моя цель - отделить выполнение фактической операции от таких вещей, как pub/sub notifications и, возможно, даже с обработкой ошибок.
Интересно, если аббревиатуры вроде DDD или CQRS или другие методы могут помочь здесь? Я, к сожалению, не очень хорошо знаком с этими концепциями, выходящими за рамки определения.
Здесь (упрощенный) пример одной такой операции WCF:
public void DoSomething(DoSomethingData data)
{
if (!_stateMachine.CanFire(MyEvents.StartProcessing))
{
throw new FaultException(...);
}
if (!ValidateArgument(data))
{
throw new FaultException(...);
}
var transitionResult =
_stateMachine.Fire(MyEvents.StartProcessing);
if (!transitionResult.Accepted)
{
throw new FaultException(...);
}
try
{
// does the actual something
DoSomethingInternal(data);
_publicationChannel.StatusUpdate(new Info
{
Status = transitionResult.NewState
});
}
catch (FaultException<MyError> faultException)
{
if (faultException.Detail.ErrorType ==
MyErrorTypes.EngineIsOffline)
{
TryFireEvent(MyServiceEvent.Error,
faultException.Detail);
}
throw;
}
}