简体   繁体   English

工厂模式实施中的问题

[英]Problems with implementation of the factory pattern

I work with web service, and I'm get response from service. 我使用网络服务,并且得到了服务的回应。 Response will be have different structure. 响应将具有不同的结构。 For example, API getInfo return response: 例如,API getInfo返回响应:

{"code":0,"message":"","result":{"nickname":"UserName","age":"22"}}

API signin: API登录:

{"code":0,"message":"","result":"user_token"}

etc. I use HttpWebRequest for POST request. 等等。我使用HttpWebRequest进行POST请求。 Request and response deserialize/serialize with DataContractSerializer . 使用DataContractSerializer对请求和响应进行反序列化/序列化。

So, I want to use factory pattern, this is my implementation: 所以,我想使用工厂模式,这是我的实现:

[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();
    }
}

I get response in callback function: 我在回调函数中得到响应:

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);
        }
    }
}

For DataContractJsonSerializer I declare the type here: 对于DataContractJsonSerializer我在这里声明类型:

var serializer = new DataContractJsonSerializer(response_obj.GetType());

Where response_obj is object, which has needed type ( ResponseSignin or ResponseGetInfo ). 其中response_obj是对象,具有所需的类型( ResponseSigninResponseGetInfo )。

So, I call Invoke() in my delegate. 因此,我在委托中调用Invoke()

private void ResponseHandler(Response result, Exception error)
{
    if (error != null)
    {
        string err = error.Message;
    }
    else
    {
        Response response = result;
    }
}

And here I have a problem. 这里我有一个问题。 Variable result really contains correct answer, but I don't get properties, because abstract class Response is without properties. 可变result确实包含正确答案,但是我没有属性,因为抽象类Response没有属性。 And I can't declare properties or override in derived classes. 而且我无法在派生类中声明属性或重写。 I'm not sure that chose the desired pattern. 我不确定是否选择了所需的模式。

Have you tried just casting the result variable to the type you need? 您是否尝试过将result变量转换为所需的类型?

Eg 例如

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);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM