请随意为问题建议一个更好的标题。我想不出一个好名字来描述这个问题。
我需要在启动时通过依赖注入来访问一个类。该类不仅应该通过它的具体实现来使用,还应该通过它实现的接口来使用。我需要确保它是通过两次注入返回的同一对象实例。
导致我想到单例案例的现实世界场景是提供接口的抽象块(IStore),多个块保存具体实现(DBStore、RedisStore)。当我尝试对每个存储实现进行运行状况检查时,我可以注入 IStore,但不能注入具体实现。我想使用一些在具体实现中初始化和修改的变量(这就是为什么我两次注入都需要相同的实例)。由于商店(希望)被用作单身人士,所以它起作用了。我并不是说存在作用域和瞬态方式的现实场景。我只是好奇如果他们不是单身人士这是否可能。
以下代码描述了我如何设法使用单例来做到这一点。
让我找到单例解决方案的方式:
有这个界面:
public interface ITestInterface
{
string ReturnAString();
int ReturnAnInt();
}
Run Code Online (Sandbox Code Playgroud)
以及这个具体的实现
public class TestImplementation : ITestInterface
{
private int counter = 0;
public string ReturnAString() {return "a string"; }
public int ReturnAnInt() { return counter++; }
}
Run Code Online (Sandbox Code Playgroud)
它们用于两个(比方说)服务。一种需要在构造函数中注入接口,另一种需要具体的实现。
Startup.ConfigureServices 方法中用于在两种情况下注入相同实例的尝试和错误:
尝试1:
// only ITestInterface is injected but not TestImplemenation
services.AddSingleton<ITestInterface, TestImplementation>();
Run Code Online (Sandbox Code Playgroud)
尝试2:
//only TestImplementation is injected (DI does not recognize it implements the Interface)
services.AddSingleton<TestImplementation>();
Run Code Online (Sandbox Code Playgroud)
尝试3:
// both are injected but they are not …Run Code Online (Sandbox Code Playgroud) 我已经看到像Ninject这样的框架以及Stack上的帖子都在使用依赖注入框架(例如下面的代码)时谈到了自绑定。
Bind<Samurai>().To<Samurai>();
Run Code Online (Sandbox Code Playgroud)
他们甚至为此具有特殊的语法:
Bind<Samurai>().ToSelf();
Run Code Online (Sandbox Code Playgroud)
为什么要将类型绑定到自身?我看不到有任何实用的应用程序可以解决此问题,并有助于减少代码中的依赖性。这是否仅意味着对类型的引用会简单地解决自身问题?