【发布时间】:2021-05-19 09:57:57
【问题描述】:
我正在构建一个锦标赛应用程序,其中当然有很多锦标赛可以玩。我从 ASP.NET Core 3.1 中的内置依赖注入中获取了一个 TournamentStore 对象。
在 Startup.cs 中,在 ConfigureServices 方法中我设置了一个临时服务:
services.AddTransient<ITournamentStore, TournamentStore>();
我通过在 TournamentService 类的构造函数中注入 IServiceProvider 来获得该服务:
public class TournamentService : ITournamentService
{
private readonly IServiceProvider _serviceProvider;
public TournamentService(
IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public async Task<ITournamentStore> GetRandomTournamentAsync(DateTime startTime)
{
var tournament = (ITournamentStore)_serviceProvider.GetService(typeof(ITournamentStore));
// add tournament details...
在 TournamentStore(我从 IServiceProvider 获得的服务)中,我正在使用 System.Timers.Timer,它应该被丢弃:
public class TournamentStore : ITournamentStore, IAsyncDisposable, IDisposable
{
private Timer _timer;
private readonly ITournamentsStore _tournaments;
private readonly IHubContext<GameHub, IGameClient> _hubContext;
private readonly IMapper _mapper;
public TournamentStore(
ITournamentsStore tournaments,
IHubContext<GameHub, IGameClient> hubContext,
IMapper mapper)
{
_tournaments = tournaments;
_hubContext = hubContext;
_mapper = mapper;
}
public string PublicId { get; set; } = Guid.NewGuid().ToString();
public string Name { get; set; }
public string Category { get; set; }
public int? CategoryId { get; set; }
public string Type { get; set; }
public string TypeId { get; set; }
public string Difficulty { get; set; }
public string DifficultyId { get; set; }
public List<QuestionModel> Questions { get; set; }
public int NumberOfQuestions => Questions.Count();
public int SecondsPerQuestion { get; set; } = 15;
public int CurrentQuestion { get; set; } = 0;
public bool Finshed => CurrentQuestion > Questions.Count();
public bool Public { get; set; }
public DateTime StartTime { get; set; }
public string StartTimeWithTimeZone => StartTime.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
public DateTime? EndTime { get; set; }
public List<Player> Players { get; set; }
public int NumberOfPlayers => Players.Count();
public void SetTournamentStartTimer()
{
var difference = StartTime - DateTime.UtcNow;
_timer = new Timer(difference.TotalMilliseconds);
_timer.Elapsed += async (sender, e) => await StartTournamentAsync();
_timer.Start();
}
private async Task StartTournamentAsync()
{
// some logic to start tournament
}
public ValueTask DisposeAsync()
{
throw new NotImplementedException();
}
public void Dispose()
{
throw new NotImplementedException();
}
所以我想知道我应该在 DisposeAsync 方法中处理完整对象还是只处理 Timer 并让垃圾收集器处理 TournamentStore 对象? 正如您所看到的,TournamentStore 对象由多个属性和两个对象列表组成,所以如果我正在处理 TournamentStore 对象,我应该将这些列表设置为 null 吗? 如果没有足够的玩家或锦标赛结束,将从对象本身调用 DisposeAsync。
【问题讨论】:
标签: c# asp.net-core