使用子生命周期时不处理对象
Objects not being disposed when using child lifetimescopes
我有一个 ASP.NET 5 应用程序,它仍然使用 EF6,我使用 Autofac 注册我的服务,如下所示:
builder.RegisterType<UnitOfWork>()
.As(typeof(IUnitOfWork))
.InstancePerDependency();
builder.RegisterAssemblyTypes(assemblies)
.Where(t => t.FullName.StartsWith("MyApp") && t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerDependency();
然后在我正在做的控制器中:
//Save object of type SomeObject
using (var scope = itemScope.BeginLifetimeScope())
{
var someService = itemScope.Resolve<ISomeService>();
var savedObject = await someService.SaveAsync(objectToSave);
}
以上代码在后台线程中循环运行。
最初我没有使用子作用域。但是随后,使用诊断工具,我注意到 SomeObject
引用正在增加,并且没有从数据上下文中删除。
所以我决定每次都添加子作用域以获得新实例。但这不是问题。它保持原样。
如果我使用的是子作用域,为什么会发生这种情况,我该如何解决?
您仍在使用 itemScope 来解析服务。请注意 scope
根本没有在 using
中使用。
//Save object of type SomeObject
using (var scope = itemScope.BeginLifetimeScope())
{
//var someService = itemScope.Resolve<ISomeService>();
var someService = scope.Resolve<ISomeService>();
var savedObject = await someService.SaveAsync(objectToSave);
}
我有一个 ASP.NET 5 应用程序,它仍然使用 EF6,我使用 Autofac 注册我的服务,如下所示:
builder.RegisterType<UnitOfWork>()
.As(typeof(IUnitOfWork))
.InstancePerDependency();
builder.RegisterAssemblyTypes(assemblies)
.Where(t => t.FullName.StartsWith("MyApp") && t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerDependency();
然后在我正在做的控制器中:
//Save object of type SomeObject
using (var scope = itemScope.BeginLifetimeScope())
{
var someService = itemScope.Resolve<ISomeService>();
var savedObject = await someService.SaveAsync(objectToSave);
}
以上代码在后台线程中循环运行。
最初我没有使用子作用域。但是随后,使用诊断工具,我注意到 SomeObject
引用正在增加,并且没有从数据上下文中删除。
所以我决定每次都添加子作用域以获得新实例。但这不是问题。它保持原样。
如果我使用的是子作用域,为什么会发生这种情况,我该如何解决?
您仍在使用 itemScope 来解析服务。请注意 scope
根本没有在 using
中使用。
//Save object of type SomeObject
using (var scope = itemScope.BeginLifetimeScope())
{
//var someService = itemScope.Resolve<ISomeService>();
var someService = scope.Resolve<ISomeService>();
var savedObject = await someService.SaveAsync(objectToSave);
}