【发布时间】:2021-03-21 23:13:15
【问题描述】:
使用 .net-core DI 框架,我将我的 Foo 服务注册为单例:
services.AddSingleton<IFoo, Foo>();
然而,我不希望任何其他开发人员创建 Foo 服务的新实例:
var storage = new TokenStorage(); // bad practice, not allowed
我知道我可以使用不可访问的构造函数在内部创建 Foo 服务单例,如下所示:
public class Foo : IFoo
{
private static _instance;
protected Foo() {}
public static IFoo GetInstance()
{
return _instance ??= new Foo();
}
}
但我不希望使用传统方式使用 Foo.GetInstance().Bar()
访问此服务简单来说,我希望 DI 框架使 Foo 成为单例,同时放弃开发人员通过 new Foo() 实例化它,而不使用单例模式。
有什么方法或模式可以实现这一点吗?
【问题讨论】:
-
我不明白,你已经对DI机制说,你注册的类是一个单例,机制现在会处理它,每次用户注入IFoo,他们都会获取在第一个请求期间创建的相同实例。
-
@IvanKhorin:OP 基本上是在试图阻止
new被直接使用。这是不可能的,AFAIK。您需要对类型的可访问性才能使用该类型,但任何破坏类型的构造函数或工厂方法的尝试都会将 DI 框架与该类型紧密绑定,这对我来说听起来是个坏主意。 -
@RobertHarvey 是的。 DI 应该只关心注入,但我想要一个不可更新的类型,不管有人使用 DI 与否。我自己认为这是不可能的,但我很担心,特别是在驱动硬件时。我总是使用 GetInstance()
-
你为什么不简单地注入单例?喜欢
services.AddSingleton<IFoo>(() => Foo.GetInstance());? -
@canton7 谢谢。实施是为了简洁。还有很多其他的事情需要考虑:c-sharpcorner.com/UploadFile/8911c4/….
标签: c# .net-core design-patterns dependency-injection singleton