Xamarin.Android中的Autofac-此设置是否正确使用? 看到内存性能问题

问题描述

我继承了Xamarin.Android应用程序,该应用程序存在内存性能问题。内存分析显示,内存中保留了许多对象(实时计数为1或更大)。我想知道 DI的配置是否对此有所贡献?

  • 该应用程序构建有 1个活动,可在几个片段页面)之间导航。
  • MVP体系结构与.NET Standard 2.0库中的视图和演示者一起使用。
  • 用于DI的Autofac

用户向前/向后导航时切换片段,即:

Fragment1 (Page1) --NAV--> Fragment2 (Page2) --BACK--> Fragment1 (Page1)

用户返回到Fragment1,Fragment2时,它是Presenter,并且子级在应用程序的生命周期中保留在内存中。

任何了解正在发生的事情的技巧/帮助将不胜感激!

我的想法/关注领域:

  1. 缺少“使用(var scope = App.Container.BeginLifetimeScope()){...}”。

    这是否意味着SingleInstance对象的作用域是根级别?

    因此,这是否可以防止在不再需要为演示者对象(注入这些对象)(以及随后的片段)分配的内存时就对其进行垃圾回收?

    鉴于以下架构,应在哪里适当地使用BeginLifetimeScope?

  2. Application.Context在类(StringResources)中作为私有字段存储/引用,然后注入到Presenter构造函数中。

[------------代码片段--------------]

AndroidApp.Application.cs

  • 在此设置了Autofac容器。

  • 三种类型的依赖项在这里注册

      builder.RegisterType<NavigationService>().As<INavigationService>().SingleInstance();
      builder.RegisterType<sqliteConnection>().As<IsqliteConnection>().SingleInstance();
      builder.RegisterType<LocationService>().As<ILocationService>().SingleInstance();
    
      //*note context is stored in StringResources: private readonly Context _context;*
      builder.Register<IStringResources>(c => new StringResources(Application.Context));
      builder.RegisterType<SamplePresenter>();
    
      builder.RegisterType<SampleRepository>().As<ISampleRepository>();
    
  • 某些依赖项已在此处解决。在应用程序中任何地方使用using(变量范围= App.Container.BeginLifetimeScope())。

      IOCContainer.Instance.Resolve<IAppConfigProvider>().Load();
    

AndroidApp.SampleFragment.cs

  • 片段的构造如下:
public class SampleFragment : BaseFragment<SamplePresenter,ISampleView>,ISampleView
    {
        .
        .
        .
    }

Core.SamplePresenter.cs

public SamplePresenter(INavigationService navigator,//.SingleInstance
                       IStringResources stringResources,//private ref to App.Context 
                       IJsonSerializer jsonSerializer,ILocationService locationService,//.SingleInstance
                       IDateUtility dateUtility,IService1 service1,IDataManager dataManager) : base(navigator)
    {
        _stringResources = stringResources;
        _jsonSerializer = jsonSerializer;
        _locationService = locationService;
        _dateUtility = dateUtility;
        _service1 = service1;
        _dataManager = dataManager;
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)