【问题标题】:Service Lifetimes in Blazor and NavigationBlazor 和导航中的服务生命周期
【发布时间】:2020-02-10 06:49:36
【问题描述】:

假设这个设置:

Page1: 

 - Component A
 - Component B

Page2: 

 - Component C
 - Component D

Service: MyService

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

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

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

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

组件是库的一部分,因此我正在寻找在消费端不需要或只需很少努力的解决方案。

怎么做?

【问题讨论】:

  • 创建并注入单例工厂服务。获取工厂并询问所需的实例。
  • 单一工厂可能会工作,但我想在用户离开第 1 页后处理该服务,所以我必须在工厂内做家务,听起来很麻烦
  • 可以在page1的dispose上调用service的dispose。

标签: asp.net-core dependency-injection blazor blazor-server-side


【解决方案1】:

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

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多