相关疑难解决方法(0)

范围/瞬态依赖注入确保返回接口和实现的相同实例

请随意为问题建议一个更好的标题。我想不出一个好名字来描述这个问题。

我需要在启动时通过依赖注入来访问一个类。该类不仅应该通过它的具体实现来使用,还应该通过它实现的接口来使用。我需要确保它是通过两次注入返回的同一对象实例。

导致我想到单例案例的现实世界场景是提供接口的抽象块(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)

c# dependency-injection .net-core asp.net-core

4
推荐指数
1
解决办法
2052
查看次数

IoC容器中的自绑定是什么?

我已经看到像Ninject这样的框架以及Stack上的帖子都在使用依赖注入框架(例如下面的代码)时谈到了自绑定。

Bind<Samurai>().To<Samurai>();
Run Code Online (Sandbox Code Playgroud)

他们甚至为此具有特殊的语法:

Bind<Samurai>().ToSelf();
Run Code Online (Sandbox Code Playgroud)

为什么要将类型绑定到自身?我看不到有任何实用的应用程序可以解决此问题,并有助于减少代码中的依赖性。这是否仅意味着对类型的引用会简单地解决自身问题?

c# dependency-injection ninject ioc-container

2
推荐指数
1
解决办法
624
查看次数