уменьшить сложность класса обслуживания - PullRequest
0 голосов
/ 01 ноября 2011

Я занимаюсь разработкой веб-API с использованием предварительного просмотра WCF Web Api. 5. В настоящее время у меня полностью функционирует класс ресурсов, как бы я ни заметил, что мои методы внутри этого ресурса становятся сложными.

Например:

[WebInvoke(UriTemplate = "{EhrID}/PhysicalTest",Method="POST")]
    public HttpResponseMessage<DTO.PhysicalTest> PostPhysicalTest(int EhrID, DTO.PhysicalTest PhysicalTestDTO)
    {
        var EHR = repository.FindById(EhrID);
        var PhysicalTest = Mapper.Map<DTO.PhysicalTest, PhysicalTest>(PhysicalTestDTO);

        if (PhysicalTest == null)
        {                
            var response = CreateResponseForException("No object to store", HttpStatusCode.BadRequest);
            throw new HttpResponseException(response);
        }

        try
        {
            if (EHR.PhysicalTests == null)
            {
                EHR.PhysicalTests = new List<PhysicalTest>();
            }
            PhysicalTest.CreationDate = DateTime.Now;
            EHR.PhysicalTests.Add(PhysicalTest);
            _unitOfWork.Commit();
            return new HttpResponseMessage<DTO.PhysicalTest>(PhysicalTestDTO, HttpStatusCode.Created);
        }
        catch (Exception ex) {                
            var response = CreateResponseForException("Cannot create Physical Test", HttpStatusCode.InternalServerError);
            throw new HttpResponseException(response);
        }
    }

Как вы можете заметить, этот метод имеет задачу публикации нового физического теста, но на самом деле он также проверяет мою модель (я все еще пропускаю множество проверок, проверок свойств), что не должно касаться этого класса. Если есть какой-нибудь доступный способ уменьшить сложность методов внутри ресурса?

1 Ответ

0 голосов
/ 02 ноября 2011

Я бы разделил его на более мелкие, более сфокусированные методы.Я мог бы также начать использовать переменные экземпляра вместо передачи всех этих аргументов, но ради этого поста я переписал его, не помещая вещи в переменные экземпляра.

[WebInvoke(UriTemplate = "{EhrID}/PhysicalTest",Method="POST")] 
public HttpResponseMessage<DTO.PhysicalTest> PostPhysicalTest(int EhrID, DTO.PhysicalTest PhysicalTestDTO) 
{ 
    var EHR = repository.FindById(EhrID); 
    var PhysicalTest = Mapper.Map<DTO.PhysicalTest, PhysicalTest>(PhysicalTestDTO); 

    if (PhysicalTest == null) 
    {                 
        var response = CreateResponseForException("No object to store", HttpStatusCode.BadRequest); 
        throw new HttpResponseException(response); 
    } 

    PostPhysicalTest(EHR, PhysicalTest);
    return new HttpResponseMessage<DTO.PhysicalTest>(PhysicalTestDTO, HttpStatusCode.Created);
}

private void PostPhysicalTest(EHR ehr, PhysicalTest physicalTest)
{
    try 
    { 
        CreatePhysicalTest(ehr, physicalTest);
    } 
    catch (Exception ex) {                 
        var response = CreateResponseForException("Cannot create Physical Test", HttpStatusCode.InternalServerError); 
        throw new HttpResponseException(response); 
    }
}

private void CreatePhysicalTest(EHR ehr, PhysicalTest physicalTest)
{
    if (ehr.PhysicalTests == null) 
    { 
        ehr.PhysicalTests = new List<PhysicalTest>(); 
    }

    physicalTest.CreationDate = DateTime.Now; 
    ehr.PhysicalTests.Add(physicalTest); 
    _unitOfWork.Commit();
}
...