没有正确的答案具体..这取决于你的应用程序已经结构化和你想要做什么。对于我们的生产UWP的应用程序,几乎所有的API调用的是业务对象下载调用,因此我们设置了每次通话的一类,其中每个实现一个共同的接口,像这样:
interface IDownloadMethod<T> : where T : IPersistable {
string WebServiceBaseURL { get; set; }
IEnumerable<T> Download();
Action<IEnumerable> RepositoryMethod { get; }
}
...其中IPersistable
是一个表示这些调用返回的数据的接口。
我们创建了一个抽象基类,它实现IDownloadMethod<T>
,与所有的通用功能:
public class AbstractDownloadMethod<T> : IDownloadMethod<T> where T : IPersistable {
// default implementations of all needed methods
// the most important one:
IEnumerable<T> Download() {
// implementation
}
}
,然后将每个下载方法成为一个非常简单的类:
internal class DownloadSomeBusinessObject : AbstractDownloadMethod<SomeBusinessObject>
{
public DownloadSomeBusinessObject (Action<IEnumerable> handler, string webServiceBaseURL, LoginCredential credential)
: base(handler, webServiceBaseURL, credential)
{
ActionURL = @"someBusinessObject/";
}
}
我们还有很长这样的API调用列表,所以我们有一个Controller
类遍历所有这些类,并调用它们的Download()
方法,然后将结果保存到存储库:
// you need to populate methodsList first with all the methods you want to call, then...
foreach (IDownloadMethod<IPersistable> method in methodsList)
{
Task<IEnumerable<IPersistable>> task = Task.Run(() => method.Download());
TaskAwaiter<IEnumerable<IPersistable>> awaiter = task.GetAwaiter();
while (!awaiter.IsCompleted)
{ // busy waiting is terrible.. we know
}
IList<IPersistable> genericList = awaiter.GetResult().ToList();
if (method.RepositoryMethod != null)
{
method.RepositoryMethod(genericList);
}
}
所以,使用'接口'似乎很普遍。 – doubleJ