繁体   English   中英

使用ASP.NET Core DI注入工厂Func

[英]Injecting a factory Func with ASP.NET Core DI

我想尝试这样的工作:

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一个成员中执行此FooService

using (var bar = _barFactory())
{
    ...
}

我得到一个ObjectDispoedException

System.ObjectDisposedException:无法访问已处置的对象。 此错误的常见原因是处理从依赖项注入解析的上下文,然后尝试在应用程序的其他位置使用相同的上下文实例。 如果您在上下文中调用Dispose()或将上下文包装在using语句中,则可能会发生这种情况。 如果使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例。

但是,如果我只做var bar = _barFactory(); ,没有using语句,我无法向DI容器发信号通知我已经完成了实例,并且可以将其处理掉。

这里的正确方法是什么?


(旁注:是的,我知道有些人会反对单件服务不应该依赖于瞬态服务。这不是这里发生的事情;单件服务依赖于单件工厂 ,它产生瞬态实例。然后单例使用一个或两个语句的瞬态服务然后用它来完成,所以这里应该没有实际的生命周期问题。)

文档中所述

容器将为其创建的IDisposable类型调用Dispose 但是,如果您自己将容器添加到容器中,则不会将其丢弃。

所以只是不要使用using语句,一切都应该没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM