ASP.Net Core: DI и события - PullRequest
       0

ASP.Net Core: DI и события

0 голосов
/ 04 января 2019

У меня есть проект ASP.NET Core, в котором у меня есть один класс DataDistaptcher, который отправляет данные на основе реализации события, и другой класс LocationFilter, который прослушивает это событие, чтобы выполнить некоторые действия на основе отправленных данных. .

Внутри DataDispatcher есть метод:

public void UpdateData(string path)
{   
        //Upload Data
        ...

        //Fire  event
        OnDataUpdated(EventArgs.Empty);

}

Конструктор LocationFilter имеет вид:

public LocationFilter(IDataDispatcher dispatcher)
{
        dispatcher.DataUpdated += new EventHandler((o,e) => UpdateData());
}

Я использую внедрение зависимостей в своем проекте и хочу обновить данные при запуске приложения, поэтому я получаю DataDispatcher из IServiceProvider и обновляю после app.UseMvc()

 // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {   
        services.AddSingleton<ILocationFilter, LocationFilter>();
        services.AddSingleton<IDataDispatcher, DataDispatcher>();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider provider)
    {   

        app.UseMvc();

        var dispatcher = provider.GetRequiredService<IDataDispatcher>();

        dispatcher.UpdateData("File path");
    }

Теперь у меня есть контроллер, в который вводится LocationFilter:

public Controller(ILocationFilter filter)
{
     //Filter dosen't contain data from dispatcher
}

Если я перенесу обновление диспетчера на Controller, событие сработает, и LocationFilter отправит данные.

Так что я не хочу запускать обновления с каждым запросом, я хочу обновлять только при запуске, так где я должен поместить метод dispatcher.update()?

1 Ответ

0 голосов
/ 05 января 2019

Из того, что я вижу, ваш одноэлементный объект LocationFilter создается только при первом вызове вашего контроллера (его конструктор должен быть конкретным). Вот почему данные отсутствуют.

Пока вы явно создаете диспетчер в методе запуска Configure, одноэлементный объект LocationFilter еще не создан. Он создается только «в первый раз», когда он запрашивается (т.е. при первом вызове конструктора вашего контроллера - после чего будет использоваться тот же объект Singleton).

"Службы времени жизни Singleton создаются при первом запросе (или когда запускается ConfigureServices и указывается экземпляр с регистрацией службы)."

Вы можете явно создать свой одноэлементный объект LocationFilter в самом методе ConfigureServices при добавлении Singleton Service. В зависимости от того, как вы его создаете, вам, возможно, придется позаботиться и об его утилизации.

Смотрите полную документацию здесь .. Прочитайте разделы о времени жизни Singleton и Service.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...