Я не могу понять, почему инъекция зависимостей работает не так, как ожидалось, когда мой контроллер получает удар, конструктор MyFirstService
снова получает удар, и поэтому я подключаю другой токен отмены к тому, который у меня будет sh быть при вызове метода StopFeeds()
.
Я пытался добавить контроллер в качестве одиночного и использовать метод контроллера StartFeed()
для создания экземпляра класса, но независимо от того, что я делаю с DI (общий ctor DI, явное присвоение свойств, [FromServices]
и даже прямая передача в коллекцию сервисов), когда я нажимаю стоп-фиды, создается еще один экземпляр MyFirstService
... Есть идеи?
Интерфейс:
public interface IFirstService : IService
{
OrderDto CreateOrder(Order order);
Task<string> ProcessOrder(string orderXml);
void ProcessLineItems(ref List<NewLineItem> items, ref int lineNum, Item i, string orderId);
NewOrderEvent NewOrderEvent(OrderDto newOrder, Order order, List<NewLineItem> lineItems);
}
MyFirstService:
public class MyFirstService : IFirstService
{
private SftpService _sftpService;
private readonly ITimer<MyService> _timer;
private readonly IMediator _mediator;
private readonly ILogger<MyService> _logger;
private readonly MyFirstConfig _iOptions;
private CancellationTokenSource CancellationTokenSource;
public MyService(IMediator mediator, ILogger<MyService> logger, IOptionsSnapshot<MyFirstConfig> iOptions)
{
_mediator = mediator;
_timer = new Timer<MyFirstService>(logger);
_logger = logger;
_iOptions = iOptions.Value;
CancellationTokenSource = new CancellationTokenSource();
CancellationTokenSource.Token.Register(FeedStopped);
}
private void CreateSftpService()
{
_sftpService = new SftpService(_iOptions.SftpOptions);
}
public void StartFeed()
{
CreateSftpService();
StartFeed(TimerSchedule);
}
public void StartFeed(TimeSpan timeSpan)
{
_timer.ScheduleCallback(timeSpan, ProcessOrderFeedAsync, CancellationTokenSource.Token);
}
public void StopFeed()
{
CancellationTokenSource.Cancel();
_sftpService.Dispose();
}
Запуск:
services.Configure<MyFirstConfig>(Configuration.GetSection("FirstSection"));
services.Configure<MySecondConfig>(Configuration.GetSection("SecondSection"));
services.AddSingleton<IFirstService, MyFirstService>();
services.AddSingleton<ISecondService, MySecondService>();
var serviceProvider = services.BuildServiceProvider();
serviceProvider.GetRequiredService<IFirstService>().StartFeed();
serviceProvider.GetRequiredService<ISecondService>().StartFeed();
Контроллер: (Я работаю с другими кодами состояния, Я убрал попытку / поймать, поскольку они не имеют значения)
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
using System.Threading.Tasks;
using SFTP.Services;
using System;
namespace API.Controllers
{
[Route("api/[controller]/")]
[ApiController]
public class MyController : Controller
{
[HttpPost]
[Route("feeds/start")]
public IActionResult StartFeed([FromServices] IFirstService myService)
{
myService.StartFeed();
return Ok();
}
[HttpPost]
[Route("feeds/stop")]
public IActionResult StopFeed([FromServices] IFirstService myService)
{
myService.StopFeed();
return Ok();
}
}
}