我有我的代碼,使web服務基於請求的類型調用。如何解決類型在運行時,以避免multipe如果其他
要做到這一點,我有以下代碼;
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/ –
什麼類的實例化的決定必須在某個地方 - 沒有得到解決。決定可以轉移到使用反射或註冊的工廠,但不能消除。 –