У меня есть код, который создает веб-сервис Call, основанный на типе запроса.Как разрешить тип во время выполнения, чтобы избежать использования multipe if else
Для этого у меня есть следующий код;
public class Client
{
IRequest request;
public Client(string requestType)
{
request = new EnrolmentRequest();
if (requestType == "Enrol")
{
request.DoEnrolment();
}
else if (requestType == "ReEnrol")
{
request.DoReEnrolment();
}
else if (requestType == "DeleteEnrolment")
{
request.DeleteEnrolment();
}
else if (requestType == "UpdateEnrolment")
{
request.UpdateEnrolment();
}
}
}
Так, как в открытом близко принципе, я могу подкласс как:
Class EnrolmentRequest:IRequest
{
CallService();
}
Class ReEnrolmentRequest:IRequest
{
CallService();
}
Class UpdateEnrolmentRequest:IRequest
{
CallService();
}
Теперь мой класс клиент будет выглядеть примерно так:
public class Client
{
public Client(string requestType)
{
IRequest request;
if (requestType == "Enrol")
{
request = new EnrolmentRequest();
request.CallService();
}
else if (requestType == "ReEnrol")
{
request = new REnrolmentRequest();
request.CallService();
}
else if (requestType == "DeleteEnrolment")
{
request = new UpdateEnrolmentRequest();
request.CallService();
}
else if (requestType == "UpdateEnrolment")
{
request = new UpdateEnrolmentRequest();
request.CallService();
}
}
}
Теперь, я до сих пор использовать if и else, и мне придется изменить свой код, если есть новый тип запроса.
Итак, это определенно, не закрыто для модификации.
Не хватает ли какой-либо вещи в отношении SOLID?
Могу ли я использовать инъекцию зависимостей, чтобы разрешать типы во время выполнения?
Откуда: 'requestType'? Это псевдокод для 'request.GetType()'? – InBetween
Возможно, это должно быть лучше опубликовано в http://codereview.stackexchange.com/ –
, решение о том, какой класс нужно создать, должно быть сделано где-то - этого не обойти. Решение может быть перенесено на фабрику, которая использует отражение или регистрацию, но ее нельзя устранить. –