我不知道如何正确地命名这个问题,所以可以自由地改变它。我的问题是,我有大约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);
}
方法非常相似,但它们返回不同的字段。我正在考虑将所有方法重构为一个,接收字段以作为参数返回。这是个好主意吗?我怎样才能做到这一点?反射?
答案 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;}
}