Понимание области действия ядра ninject в сервисе windows - PullRequest
0 голосов
/ 15 марта 2020

Я работаю над приложением Windows. Программа создает ServiceScheduler ... ServiceScheduler, запускается каждые 30 минут, читает список названий организаций и импортирует данные из каждой из этих организаций:

class Program
{
    // entry point of the programe
    static void Main(string[] args)
    {
        HostFactory.Run(serviceConfig =>
        {
            serviceConfig.Service<ServiceScheduler>(serviceInstance =>
            {
                serviceInstance.ConstructUsing(() => new ServiceScheduler());

                serviceInstance.WhenStarted((execute, hostControl) => execute.Start(hostControl));
            });

            serviceConfig.StartAutomaticallyDelayed();
         });
    }
}

А вот ServiceScheduler:

public class ServiceScheduler
{
    private Timer _standardTimer;
    private HostControl _hostControl;
    private IKernel _kernel;

    public ServiceScheduler()
    {
        _standardTimer = new Timer();
        _kernel = new StandardKernel(new ImporterModule());
    }

    public bool Start(HostControl hostControl)
    {
        _hostControl = hostControl;
        _standardTimer.Interval = 108000; // 30 min
        _standardTimer.Elapsed += new System.Timers.ElapsedEventHandler(StandardTimerHandler);
        _standardTimer.Start();
        return true;
    }

    private void StandardTimerHandler(object sender, ElapsedEventArgs e)
    {
        // use ninject to resolve DB repository
        var repository = _kernel.Get<IOrganisationRepository>();
        var organisations = repository.GetAll(); //<-- list of organisation names

        foreach (string organisationName in organisations)
        {
            // ImporterFactory creates the correct importer based on the organisationName
            var importer = ImporterFactory.GetImporter(organisationName); 
            importer.import();
        }
    }
}
  1. Я видел этот ответ , который гласит: Доступ к ядру возможен только из Program.Main или внутри фабрики ... это неправильно, что я инициализирую Kernel внутри планировщика? Если да, то как мне это исправить?

  2. Я не знаю, какой должна быть область действия ядра ядра? В приведенном выше примере я использую один экземпляр Kernel для всего времени жизни приложения? Это правильно, или я должен создавать новый экземпляр на каждой итерации процесса импорта?

  3. ImporterFactory является классом stati c. Он принимает имя_организации и создает правильный импортер на основе имени_организации. Мне нужно будет использовать ядро ​​ninject на заводе, как мне это сделать? Должен ли я передать Ядро на фабрику или создать новый kernel внутри фабрики?

...