Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin、Autofac、导航服务和BeginLifetimeScope_Xamarin_Dependency Injection_Autofac_Object Lifetime - Fatal编程技术网

Xamarin、Autofac、导航服务和BeginLifetimeScope

Xamarin、Autofac、导航服务和BeginLifetimeScope,xamarin,dependency-injection,autofac,object-lifetime,Xamarin,Dependency Injection,Autofac,Object Lifetime,在xamarin应用程序中,关于autofac的LifetimeScope以及何时使用它们的初学者问题 如本文()所述,autofac文档()引用了这篇文章他们极力主张不从根容器解析,而是使用单独的生命周期范围,并根据工作单元进行思考,因为autofac保留对一次性对象的引用,即使在处理创建对象的作用域之前不再使用这些对象,因此存在内存泄漏的危险 然而,在开发Xamarin应用程序并寻找示例时,我没有发现这种用法的示例,同时考虑到使用IoC容器作为服务定位器anitpattern,什么时候会使用

在xamarin应用程序中,关于autofac的LifetimeScope以及何时使用它们的初学者问题

如本文()所述,autofac文档()引用了这篇文章他们极力主张不从根容器解析,而是使用单独的生命周期范围,并根据工作单元进行思考,因为autofac保留对一次性对象的引用,即使在处理创建对象的作用域之前不再使用这些对象,因此存在内存泄漏的危险

然而,在开发Xamarin应用程序并寻找示例时,我没有发现这种用法的示例,同时考虑到使用IoC容器作为服务定位器anitpattern,什么时候会使用它?()

这些文章展示了在xamarin应用程序中设置导航、解析必要的viewmodels并将其设置为页面的bindingcontext的“最佳实践”示例: 及 不确定这是最佳实践还是以xamarin的形式做事的最佳方式

但是,当这些viewmodels被autofac实例化,并且其中一个模型依赖于可一次性使用的类时,会发生什么情况

当请求viewModel时,将解析一个与页面匹配的新实例,并将其放在导航堆栈上。因此,当导航页面时,堆栈会越来越大,autofac会保留对所有一次性对象的引用,并且在应用程序的生命周期内(所有内容都会从主容器中解决,不使用单独的作用域),这可能会持续很长时间,是否存在内存问题的风险?如果存在仍然被引用的风险,那么这些未使用的对象何时会被垃圾回收?可能我对它的实际工作原理没有多少了解,或者在使用过程中犯了错误,但是请注意,当导航到另一个页面时,来自的InternalNavigateToAsync方法是如何不断向堆栈中添加页面的

另一方面,这看起来很好(scope.Resolve):

使用(var scope=container.BeginLifetimeScope())
{
对于(变量i=0;i<100;i++)
{
var w=scope.Resolve();
w、 销钉();
}
}
这来自(以及其他一些地方):

使用(var scope=container.BeginLifetimeScope())
{
var reader=container.Resolve();
}

在autofac文档中使用,我想最后一个是打字错误??(container.Resolve而不是scope.Reslove周围有一个无用的(?)scope块,在这个scope块内从主容器解析…

遗憾的是,AutoFac和其他所谓的“IOC”容器和/或框架往往夸大了它们的功能。它们也不太像IOC

如果我创建这个普通类:

public class NonDerivedClass
{
    using (var scope = contaner.BeginLifetimeScope())
    {
        var reader = container.Resolve<IConfigReader>();
    }
}  
公共类非派生类
{
使用(var scope=contaner.BeginLifetimeScope())
{
var reader=container.Resolve();
}
}  
…然后我实例化、使用并最终销毁非DerivedClass,读者如何知道也要销毁?我的意思是,根据C#,使用什么机制?没有任何机制。当对象超出范围并符合垃圾收集条件时,不会引发任何事件

没有证据表明您的示例实现了IDisposable,但即使它们实现了,IDisposable也没有提供“死亡事件”,因此这不是解决方案

在这种情况下。您的本地“reader”变量将与非DerivedCass一起消亡,因为它是该类的私有变量。但全局存储的IConfigReader实例在整个应用生命周期内保持活动状态

全局变量不是你的朋友。坚持坚实的设计原则(参见)

这些备注的完整代码位于。请参阅相关的解决方案,如antipattern.sln和IocAntipattern.sln


GitHub网站还提供了有关此主题的更详细讨论的链接。

您是否找到了解决可支配资源问题的优雅解决方案?我看到的唯一方法是在视图模型中按需实例化它们,并具有适当的生存期范围。只有模型视图本身知道何时不再需要该服务
using(var scope = container.BeginLifetimeScope())
{
  var reader = container.Resolve<IConfigReader>();
}
public class NonDerivedClass
{
    using (var scope = contaner.BeginLifetimeScope())
    {
        var reader = container.Resolve<IConfigReader>();
    }
}