Xamarin、Autofac、导航服务和BeginLifetimeScope
在xamarin应用程序中,关于autofac的LifetimeScope以及何时使用它们的初学者问题 如本文()所述,autofac文档()引用了这篇文章他们极力主张不从根容器解析,而是使用单独的生命周期范围,并根据工作单元进行思考,因为autofac保留对一次性对象的引用,即使在处理创建对象的作用域之前不再使用这些对象,因此存在内存泄漏的危险 然而,在开发Xamarin应用程序并寻找示例时,我没有发现这种用法的示例,同时考虑到使用IoC容器作为服务定位器anitpattern,什么时候会使用它?() 这些文章展示了在xamarin应用程序中设置导航、解析必要的viewmodels并将其设置为页面的bindingcontext的“最佳实践”示例: 及 不确定这是最佳实践还是以xamarin的形式做事的最佳方式 但是,当这些viewmodels被autofac实例化,并且其中一个模型依赖于可一次性使用的类时,会发生什么情况 当请求viewModel时,将解析一个与页面匹配的新实例,并将其放在导航堆栈上。因此,当导航页面时,堆栈会越来越大,autofac会保留对所有一次性对象的引用,并且在应用程序的生命周期内(所有内容都会从主容器中解决,不使用单独的作用域),这可能会持续很长时间,是否存在内存问题的风险?如果存在仍然被引用的风险,那么这些未使用的对象何时会被垃圾回收?可能我对它的实际工作原理没有多少了解,或者在使用过程中犯了错误,但是请注意,当导航到另一个页面时,来自的InternalNavigateToAsync方法是如何不断向堆栈中添加页面的 另一方面,这看起来很好(scope.Resolve):Xamarin、Autofac、导航服务和BeginLifetimeScope,xamarin,dependency-injection,autofac,object-lifetime,Xamarin,Dependency Injection,Autofac,Object Lifetime,在xamarin应用程序中,关于autofac的LifetimeScope以及何时使用它们的初学者问题 如本文()所述,autofac文档()引用了这篇文章他们极力主张不从根容器解析,而是使用单独的生命周期范围,并根据工作单元进行思考,因为autofac保留对一次性对象的引用,即使在处理创建对象的作用域之前不再使用这些对象,因此存在内存泄漏的危险 然而,在开发Xamarin应用程序并寻找示例时,我没有发现这种用法的示例,同时考虑到使用IoC容器作为服务定位器anitpattern,什么时候会使用
使用(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>();
}
}