Срок службы в Blazor и навигации - PullRequest
0 голосов
/ 13 октября 2019

Создайте эту настройку:

Page1: 

 - Component A
 - Component B

Page2: 

 - Component C
 - Component D

Service: MyService

Я хочу, чтобы Компонент A и B получили один и тот же экземпляр MyService.

Компоненты C и D должны получить новый (и тот же) экземплярof MyService.

Когда я регистрирую MyService как transient, каждый компонент получает новый экземпляр.

Когда я регистрируюсь как singleton / scoped, все компоненты имеют один и тот же экземпляр.

Компоненты являются частью библиотеки, и поэтому я ищу решение, которое не требует или требует очень небольших усилий со стороны потребителя.

Как это можно сделать?

1 Ответ

0 голосов
/ 15 октября 2019

Похоже, что нет встроенного способа справиться с этим. Поэтому я пошел с фабрикой синглтонов и связал ее с NavigationManager.

 public class MyServiceFactory
    {
        private NavigationManager _navigationManager;

        private Dictionary<string, MyService> _state = new Dictionary<string, MyService>();

        public MyServiceFactory(NavigationManager navigationManager)
        {
            _navigationManager = navigationManager;

            _navigationManager.LocationChanged += (s, e) =>{

                _state.Remove(_state.Keys.Single(x => x != e.Location));
            };
        }

        public MyService Get() 
        {
            if(!_state.ContainsKey(_navigationManager.Uri))
            {
                _state.Add(_navigationManager.Uri, new MyService());
            }

            return _state[_navigationManager.Uri];
        }

    }
}
...