将多种方法重构为一种

时间:2011-10-27 17:19:34

标签: c# jquery

我不知道如何正确地命名这个问题,所以可以自由地改变它。我的问题是,我有大约10种方法,如:

[WebMethod(EnableSession = true)]
public string ReadUserAdditional()
{
    EUser user = (EUser)Session["user"];

    var json = new { result = true, user.Image, user.Biography };

    return new JavaScriptSerializer().Serialize(json);
}


[WebMethod(EnableSession = true)]
public string ReadUserBasicInformation()
{
    EUser user = (EUser)Session["user"];

    var json = new { result = true, user.Name, user.Username};

    return new JavaScriptSerializer().Serialize(json);
}

方法非常相似,但它们返回不同的字段。我正在考虑将所有方法重构为一个,接收字段以作为参数返回。这是个好主意吗?我怎样才能做到这一点?反射?

4 个答案:

答案 0 :(得分:0)

我认为这不是一个糟糕的主意,特别是如果您有大量这些方法并希望简化您的API。

一些缺点:

1)反思来自于成本。这可能并不重要,除非你是Twitter的大小。

2)如果数据具有您不希望用户访问的任何属性(例如某种内部数据库密钥或其他内容),则可能存在安全问题。确保你班上的每个房产都是一个你完全可以成为公共信息的房产。

答案 1 :(得分:0)

首先,你需要知道对象和字典是在json simmilar中呈现的。

[WebMethod(EnableSession = true)]
public string ReadUserAdditional()
{
    return GetUserInfo(new [] 
    {
        new FieldInfo {Name = "Image", u => u.Image},
        new FieldInfo {Name = "Biography", u => u.Biography} 
    });
}

private string GetUserInfo(FieldInfo[] infos) 
{
    EUser user = (EUser)Session["user"];

    var dict = new Dictionary<string, object>{ { "result", true } };
    foreach(var info in infos) 
    {
        dictionary.Add(info.Name, info.Accessor(user));
    }

    return new JavaScriptSerializer().Serialize(dict );
}

public class FieldInfo 
{
    public Func<EUser, object> Accessor { get; set; }
    public string Name { get; set;}
}

答案 2 :(得分:0)

您可以使用lambda重构重复:这会将您的所有方法都减少到一行代码:

[WebMethod(EnableSession = true)]
public string ReadUserAdditional()
{
    return GetUserJSON(x => new { result = true, x.Image, x.Biography });
}

[WebMethod(EnableSession = true]
public string ReadUserBasicInformation()
{
    return GetUserJSON(x => new { result = true, x.Name, x.UserName });
}

private string GetUserJSON(Func<EUser, string> jsonFields)
{
    EUser user = (EUser)Session["user"];
    var json = jsonFields(user);
    return new JavaScriptSerializer().Serialize(json);
}

答案 3 :(得分:0)

另一种方法是使用Automapper或类似的库来投射数据。

[WebMethod(EnableSession = true)]
public string ReadUserAdditional()
{
    return GetUserInfo<UserAdditionalDto>();
}

private string GetUserInfo<TDto>(FieldInfo[] infos) 
{
    EUser user = (EUser)Session["user"];

    var dto = Mapper.Map<TDto>(user); // Mapper is Automapper entry class.

    return new JavaScriptSerializer().Serialize(dto );
}

public class UserAdditionalDto
{
    public string Image { get; set; }
    public string Biography { get; set;}
}