C# 工厂模式实施中的问题
我使用web服务,并从服务获得响应。响应将具有不同的结构。例如,API getInfo返回响应:C# 工厂模式实施中的问题,c#,json,httpwebrequest,factory-pattern,C#,Json,Httpwebrequest,Factory Pattern,我使用web服务,并从服务获得响应。响应将具有不同的结构。例如,API getInfo返回响应: {"code":0,"message":"","result":{"nickname":"UserName","age":"22"}} API签名: {"code":0,"message":"","result":"user_token"} 等等。 我使用HttpWebRequest进行POST请求。请求和响应使用DataContractSerializer反序列化/序列化 所以,我想使用工厂模
{"code":0,"message":"","result":{"nickname":"UserName","age":"22"}}
API签名:
{"code":0,"message":"","result":"user_token"}
等等。
我使用HttpWebRequest
进行POST请求。请求和响应使用DataContractSerializer
反序列化/序列化
所以,我想使用工厂模式,这是我的实现:
[DataContract]
public class ResultGetInfo
{
[DataMember(Name = "nickname")]
public int Nickname { get; set; }
[DataMember(Name = "age")]
public int Age { get; set; }
}
[DataContract]
public abstract class Response
{
}
[DataContract]
public class ResponseSignin : Response
{
[DataMember(Name = "code")]
public int Code { get; set; }
[DataMember(Name = "message")]
public string Message { get; set; }
[DataMember(Name = "result")]
public string Result { get; set; }
}
[DataContract]
public class ResponseGetInfo : Response
{
[DataMember(Name = "code")]
public int Code { get; set; }
[DataMember(Name = "message")]
public string Message { get; set; }
[DataMember(Name = "result")]
public ResultGetInfo Result { get; set; }
}
public abstract class CreateResponse
{
public abstract Response CreateResponseObj();
}
public class CreateResponseSignin : CreateResponse
{
public override Response CreateResponseObj()
{
return new ResponseSignin();
}
}
public class CreateResponseGetInfo : CreateResponse
{
public override Response CreateResponseObj()
{
return new ResponseGetInfo();
}
}
我在回调函数中得到响应:
private void getResponseCallback(IAsyncResult asynchronousResult)
{
var request = (Request)asynchronousResult.AsyncState;
try
{
HttpWebResponse response;
// End the get response operation
response = (HttpWebResponse)request.HttpRequest.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamReader = new StreamReader(streamResponse);
var gyResponse = streamReader.ReadToEnd();
streamResponse.Close();
streamReader.Close();
response.Close();
Response response_obj = request.Creater.CreateResponseObj();
using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(gyResponse)))
{
var serializer = new DataContractJsonSerializer(response_obj.GetType());
response_obj = (Response)serializer.ReadObject(stream);
if (request.CallBack != null)
{
request.CallBack.Invoke(response_obj, null);
}
}
}
catch (WebException e)
{
if (request.CallBack != null)
{
request.CallBack.Invoke(null, e);
}
}
}
对于DataContractJsonSerializer
我在这里声明类型:
var serializer = new DataContractJsonSerializer(response_obj.GetType());
其中,response\u obj
是对象,它具有所需的类型(ResponseSignin
或ResponseGetInfo
)
因此,我在委托中调用Invoke()
private void ResponseHandler(Response result, Exception error)
{
if (error != null)
{
string err = error.Message;
}
else
{
Response response = result;
}
}
这里我有个问题。变量
result
确实包含正确的答案,但我没有得到属性,因为抽象类Response
没有属性。我不能在派生类中声明属性或重写。我不确定是否选择了所需的模式。您是否尝试将结果
变量强制转换为所需的类型
例如
非常感谢。目前,这是我能实现的最佳解决方案:)
private void ResponseHandler(Response result, Exception error)
{
if (error != null)
{
string err = error.Message;
return;
}
var signInResponse = result as ResponseSignin;
if (signInResponse != null)
{
HandleSignInResponse(signInResponse);
}
var infoResponse = result as ResponseGetInfo;
if (infoResponse != null)
{
HandleInfoResponse(infoResponse);
}
}