Blazor和导航中的服务寿命

问题描述 投票:1回答:1

设置此设置:

Page1: 

 - Component A
 - Component B

Page2: 

 - Component C
 - Component D

Service: MyService

我希望组件A和B获得相同的MyService实例。

组件C和D应该获得MyService的新的(和相同的)实例。

当我将MyService注册为transient时,每个组件都会获得一个新的实例。

当我注册为singleton / scoped时,所有组件共享相同的实例。

组件是库的一部分,因此我正在寻找在消耗方面不需要或需要很少工作的解决方案。

如何完成?

asp.net-core dependency-injection blazor blazor-server-side
1个回答
0
投票

似乎没有内置的方法来处理它。所以我去了单例工厂,并将其链接到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];
        }

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.