我很快在Notepad ++中输入了此信息,因此请原谅任何错别字/错误。如果可能的话,我会摆脱一些重复的工作(例如,长案子声明)。没什么大不了的,但是我很好奇是否有可能,如果可以的话,实际实现代码有多糟糕。
jsonFromWebpage = {
StatusUpdate: {
QueryType: "Someclassname",LocalCount: 5,RemoteCount: 5
},StatusUpdate: {
QueryType: "AnotherClass",LocalCount: 29,RemoteCount: 30
}
}
// Model
public class StatusUpdate
{
public string QueryType { get; set; }
public int LocalCount { get; set; }
public int RemoteCount { get; set; }
}
// Controller
public IactionResult GetStatusUpdate([FromBody] List<StatusUpdate> status)
{
_service.GetStatusUpdate(status);
return status
}
// Service
public List<Status> GetStatusUpdate(List<StatusUpdate> status)
{
foreach(var s in status)
{
var typeArgument = s.QueryType; // <--- Is there a way for this...
status.CurrentCount = GetTotalCount<typeArgument>(); // <--- to work here?
status.RemoteCount = thisworksfineforotherreasons(s.QueryType);
}
}
// Repo
public int GetTotalCount<T>() where T: class
{
var result = _db.getcount<T>();
return result;
}
编辑
首先,感谢所有回应的人。到目前为止,已经阅读了所有内容,我想提供更多背景信息。这是该示例的另一种用法:
// View
<div class="col-12">
<div class="api-types">History</div>
<div class="progress-bar">50 out of 50 copied</div>
</div>
<div class="col-12">
<div class="api-types">Users</div>
<div class="progress-bar">25 out of 32 copied</div>
</div>
// -- View javascript
var types = [];
$(".api-types").each(function (c,i) {
types.push({ ApiandClassname: $(i).text() });
});
pushToController(JSON.stringify(types));
// Controller
public IactionResult GetSyncStatus(List<SyncStatusVM> status)
{
_service.GetSyncStatus(status);
return Json(status);
}
// Service
public List<SyncStatusVM> GetSyncStatus(List<SyncStatusVM> status)
{
foreach(var s in status)
{
// LocalCount
var magicTypeFigurator = s.ApiandClassname
s.LocalCount = _repo.getcount<magicTypeFigurator>(); <-- "this is a variable but should be a type..."
// Remote
var url = $"https://api.domain.com/{s.ApiandClassname.ToLower()}"
s.RemoteCount = FetchCountFromApi(url);
}
return status;
}
// Repository
public long getcount<T>()
{
var result = _orm.Count<T>();
return result;
}
// Models
public class SyncStatusVM
{
public string ApiandClassname { get; set; }
public int LocalCount { get; set; }
public int RemoteCount { get; set; }
}
public class History
{
public long Id {get;set;}
public DateTime CreatedDate {get;set;}
public string Message {get;set;}
}
public class Users
{
public long Id {get;set;}
public string FirstName {get;set;}
public string LastName {get;set;}
}
使用此代码,我可以在视图中创建一个节,并为每种类型创建一个类。该类由ORM重用,并从API反序列化。最麻烦的一点是在控制器中有一个case语句,该语句基于“ ApiandClassname”以正确的类型调用通用方法。我可以编辑ORM,因此它是基于字符串的而不是通用的,但由于各种原因,我不喜欢该方法。我可以将case语句转换为控制器中的集合,也可以仅将其移至服务层,但是我所拥有的已经可以了。我也可以重构,以便从集合中构建视图,但是在其他数据点上,这并不是最佳选择。除非我缺少某些东西,否则字符串事物的通用参数还很有意义。这是一个附带条件的案例……并且有点好奇是否可以做得很好。