我正试图让这样的事情发挥作用:
public class FooService : IFooService {
public FooService(Func<IBarService> barFactory) { ... }
}
public class BarService : IBarService, IDisposable { ... }
services.AddSingleton<IFooService, FooService>();
services.AddTransient<IBarService, BarService>();
services.AddSingleton<Func<IBarService>>(ctx => () => ctx.GetService<IBarService());
就解析BarService
实例而言,这是有效的,但我无法弄清楚如何正确管理其生命周期。当我在FooService
的一个成员中执行此操作时:
using (var bar = _barFactory())
{
...
}
我得到ObjectDispoedException
:
System.ObjectDisposedException:无法访问已处置的对象。此错误的常见原因是处理从依赖项注入解析的上下文,然后尝试在应用程序的其他位置使用相同的上下文实例。如果您在上下文中调用Dispose()或将上下文包装在using语句中,则可能会发生这种情况。如果使用依赖注入,则应该让依赖注入容器处理上下文实例。
但是,如果我只做var bar = _barFactory();
,没有using语句,我就无法向DI容器发信号通知我已经完成了实例,并且可以处理它。
这里的正确方法是什么?
(旁注:是的,我知道有些人会反对单身人士服务不应该依赖于瞬态服务。这不是这里发生的事情;单身人士服务依赖于单身工厂 ,产生瞬态实例。然后单例使用瞬态服务一个或两个语句,然后完成它,所以这里应该没有实际的生命周期问题。)
答案 0 :(得分:4)
如documentation中所述:
容器会针对其创建的
Dispose
类型调用IDisposable
。但是,如果您自己将容器添加到容器中,则不会将其丢弃。
所以,不要使用using
语句,一切都应该没问题。