【发布时间】:2019-01-25 12:20:11
【问题描述】:
我注册了两次课程,但合同不同。
services
.AddSingleton<MyClass>()
.AddSingleton<IHostedService>(sp => sp.GetService<MyClass>());
该类还实现了IDisposable,这意味着将在应用程序关闭时调用 Dispose 方法。但是因为注册了两次,所以会被调用两次。
Autofac 有两种方法可以解决这个问题:
builder.RegisterType<MyClass>().AsSelf().As<IHostedService>();
//or
builder.RegisterType<MyClass>().AsSelf();
builder.Register(ctx => ctx.Resolve<MyClass>()).As<IHostedService>().ExternallyOwned();
但似乎无法在 ASP.NET Core 中使用 Microsoft DependencyInjection 执行任何操作。有办法解决吗?
【问题讨论】:
-
从技术上讲,它不应该让你添加相同类型的单例两次;这就是它是单例的全部原因。既然这样,我相信您可以自行设置不同的设置。基于这个问题,我自己从未尝试过;我个人觉得这是框架中的 2 个不同的错误。
-
Kirk Larkin 也是正确的,但并非所有 Disposable 类型都如此;很遗憾。如果您正在设计 Disposable 类型,那么我建议遵循该规则。
-
第二个不是类型注册。你注册了一个工厂方法,工厂方法解析
MyClass,所以两者都是完全相同的实例 -
@Tseng 是的,它们是同一个实例。这就是为什么它这样注册的全部想法。
-
@KirkLarkin 看不到 Duncan 的任何回答。
标签: c# asp.net-core dependency-injection autofac