Как выполнить сервис в Global Session_Start () - PullRequest
0 голосов
/ 18 января 2019

В настоящее время у меня есть приложение asp.net mvc с реализацией ABP. В настоящее время я хочу выполнить сервисный метод внутри Session_Start (), могу я спросить, как бы я это сделал.

Служба может быть запущена везде, где у меня есть доступ к решению IOC, но я нахожусь в глобальном файле, и я не совсем уверен, как это сделать оттуда.

protected void Session_Start()
{
    // starting a session and already authenticated means we have an old cookie
    var existingUser = System.Web.HttpContext.Current.User;
    if (existingUser != null && existingUser.Identity.Name != "")
    {
        // execute app service here.
        // if I'm exposed to IOCresolver I would do the following below
        var srv = _iocResolver.Resolve<SettingsAppService>();
        srv.UpdateItems();
    }
}

Могу ли я спросить, как получить доступ к IOC resolver в файле global.asax.cs, если это возможно? Моя цель - запустить службу, когда пользователь восстановил свой сеанс.

Ответы [ 2 ]

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

Из документации на Внедрение зависимостей :

IIocResolver (и IIocManager) также имеют метод расширения CreateScope (определенный в пространстве имен Abp.Dependency) для безопасного освобождения всех разрешенных зависимостей.

В конце использования блока все разрешенные зависимости автоматически удаляются.

Если вы находитесь в статическом контексте или не можете внедрить IIocManager, в качестве крайней меры вы можете использовать одноэлементный объект IocManager.Instance везде.

Итак, используйте область с IocManager.Instance:

  • using (var scope = IocManager.Instance.CreateScope()) { ... }
    IocManager.Instance.UsingScope(scope => { ... })
protected void Session_Start()
{
    // Starting a session and already authenticated means we have an old cookie
    var existingUser = System.Web.HttpContext.Current.User;
    if (existingUser != null && existingUser.Identity.Name != "")
    {
        IocManager.Instance.UsingScope(scope => // Here
        {
            // Execute app service here.
            var srv = scope.Resolve<SettingsAppService>();
            srv.UpdateItems();
        });
    }
}
0 голосов
/ 18 января 2019

Вы можете создать статическую ссылку на свой распознаватель IoC и использовать ее в Global.asax.Вы даже можете добавить его в Global.asax.cs.Установите это свойство после регистрации контейнера и используйте его из любого места.

public static YourIocResolver IocResolver { get; set; }
...