C# 通过不同的请求跟踪.net应用程序变量
在.Net应用程序中,当使用C时,我必须进行一个昂贵的调用,以便向第三方API获取一些数据,这取决于这个API,有时我希望它的速度较慢 问题是,这些数据是准确的,但我自己可以用较低的精度来计算。所以我在想,如果使用我自己的实现,我如何能够跟踪过去5分钟内的平均请求时间,以及它是否大于我的阈值更改 该方法的草图如下所示:C# 通过不同的请求跟踪.net应用程序变量,c#,asp.net,application-state,C#,Asp.net,Application State,在.Net应用程序中,当使用C时,我必须进行一个昂贵的调用,以便向第三方API获取一些数据,这取决于这个API,有时我希望它的速度较慢 问题是,这些数据是准确的,但我自己可以用较低的精度来计算。所以我在想,如果使用我自己的实现,我如何能够跟踪过去5分钟内的平均请求时间,以及它是否大于我的阈值更改 该方法的草图如下所示: public int GetMyData() { return isTooSlow() ? _ownImplementation.GetData(
public int GetMyData()
{
return isTooSlow() ? _ownImplementation.GetData() : thirdParty.GetData();
}
即使在理想情况下,我希望能够将第三方封装在一个接口中,我的接口将在运行时实现并更改它,这将是一个很好的选择
但主要的问题是如何在记忆中保持这种状态。我只能考虑使用静态类,并且我已经阅读了ApplicationState的相关内容,但不确定这些是否是最好的方法
此外,不是针对我的小项目,而是如何扩展这些解决方案?如果我必须考虑我的应用程序运行的几个实例,我认为唯一的解决方案是使用外部存储redis或类似的?并在执行检查时查询它
很抱歉,如果问题太笼统,但认为这是一个有趣的问题要解决,不知道如何最好地解决它
谢谢我将把多个应用程序实例的问题放在次要位置。这并不重要,但如果您是针对接口编程的,那么在某个时候您可以用缓存的东西替换您的实现 如果您希望平均请求时间超过5分钟,那么您需要一个弹出过期条目的列表。这里有一个尝试:
internal class TimestampedEntry<T>
{
internal DateTimeOffset Timestamp { get; private set; }
internal T Value { get; private set; }
internal TimestampedEntry(T value)
{
Timestamp = DateTimeOffset.Now;
Value = value;
}
}
public class ExpiringList<T>
{
private readonly List<TimestampedEntry<T>> _list = new List<TimestampedEntry<T>>();
private readonly TimeSpan _expiration;
public ExpiringList(TimeSpan expiration)
{
_expiration = expiration;
}
public void Add(T item)
{
lock (_list)
{
_list.Add(new TimestampedEntry<T>(item));
}
}
public IReadOnlyCollection<T> Read()
{
var cutoff = DateTimeOffset.Now - _expiration;
TimestampedEntry<T>[] result;
lock (_list)
{
result = _list.Where(item => item.Timestamp > cutoff).ToArray();
_list.Clear();
_list.AddRange(result);
}
return new ReadOnlyCollection<T>(result.Select(item => item.Value).ToList());
}
}
您的类只依赖于工厂接口。实现IMyDataProviderFactory的类会检查您的平均响应时间,并返回调用外部API的IMyDataProvider实现或使用您的计算的实现
这样,该逻辑的复杂性就与依赖于API的任何类分开了
温莎也很擅长这些。其他DI容器也使它们变得简单,这种功能内置在ASP.NET内核中。您没有询问依赖注入,但我建议您调查一下。它使管理这种复杂性和保持其可维护性变得更容易
回到多个应用程序实例和分布式缓存,您可以看到工厂模式实现如何使其更易于管理。假设今天这是一个实例,但明天您希望通过分布式缓存共享此数据。你在哪里换的?依赖于此API的大多数代码根本不需要更改,因为它不知道这些实现细节。您将更改存储每个API调用的计时的代码,并更改工厂的实现 如果您有自己的实现,那么为什么需要呼叫第三方?或者在几个小时后打电话给第三方,并将数据存储在某个地方,以便您能够更快地获取数据。数据在第三方上实时更新,因此我希望每次都打电话给它,除非它在最后几分钟内几乎没有响应。
interface IMyDataProviderFactory
{
IMyDataProvider Create();
}