.net core netcore DI容器使用重载返回相同注册的不同实例

.net core netcore DI容器使用重载返回相同注册的不同实例,.net-core,.net Core,我在netcore的DI框架中遇到了一个问题。我知道在DI容器中注册类型的不同方法 具体来说,我对.AddSingleton方法感兴趣。这种方法有许多重叠 我的问题是,我想确保当我以不同的方式注册同一个类时(使用接口和类类型),然后创建两个实例,每个“注册”方式一个 假设我有一个名为ISomeInterface的接口,它的一个实现名为ImplementationOfSomeInterface 在我的例子中,我希望DI系统在请求某些接口的实现时创建一个实例。此外,在某些地方,我仅使用接口inter

我在netcore的DI框架中遇到了一个问题。我知道在DI容器中注册类型的不同方法

具体来说,我对
.AddSingleton
方法感兴趣。这种方法有许多重叠

我的问题是,我想确保当我以不同的方式注册同一个类时(使用接口和类类型),然后创建两个实例,每个“注册”方式一个

假设我有一个名为
ISomeInterface
的接口,它的一个实现名为
ImplementationOfSomeInterface

在我的例子中,我希望DI系统在请求某些接口的
实现时创建一个实例。此外,在某些地方,我仅使用接口
interface
定义依赖关系

问题是DI系统返回2个someInterface的
实现实例。一个用于依赖关系与类相关的情况,另一个用于依赖关系由接口给出的情况

我已经查阅了许多文档和教程,但它们都只是解释了
AddSingleton
AddScoped
等的区别

// registration with the class type
services.AddSingleton<ImplementationOfSomeInterface>()

//registration with an interface and the corresponding 'same' class type
services.AddSingleton<ISomeInterface, ImplementationOfSomeInterface>();

//--------- now the usage of it -------------------
public TestClassA(SomeInterfaceImplementation instance)
    {
      var resultingInstA = instance;

    }

    public TestClassB(ISomeInterface instance)
    {
      var resultingInstB = instance;

    }

//I would expect that resultingInstA is pointing to the very same object of 
//resultingInstB => but they are different!
//向类类型注册
services.AddSingleton()
//使用接口和相应的“相同”类类型注册
services.AddSingleton();
//---------现在看看它的用法-------------------
公共TestClassA(SomeInterfaceImplementation实例)
{
var resultingInstA=实例;
}
公共TestClassB(接口实例)
{
var resultingInstB=实例;
}
//我希望resultingInstA指向的是同一个对象
//resultingInstB=>但它们是不同的!
我希望
resultingInstA
指向的是
resultingInstB
=>的同一个对象,但它们是不同的


如何才能恢复相同的实例?

您可以注册类的实例,而不仅仅是类型

var instance = new ImplementationOfSomeInterface();
services.AddSingleton(instance);
services.AddSingleton<ISomeInterface>(instance);
var instance=someInterface()的新实现;
services.AddSingleton(实例);
services.AddSingleton(实例);

现在,任何试图解析SomeInterface的
实现
ISomeInterface
的尝试都将返回在此初始化的实例。

您可以通过注册类的实例而不仅仅是类型来完成

var instance = new ImplementationOfSomeInterface();
services.AddSingleton(instance);
services.AddSingleton<ISomeInterface>(instance);
var instance=someInterface()的新实现;
services.AddSingleton(实例);
services.AddSingleton(实例);

现在,任何试图解析SomeInterface
或ISomeInterface
实现的尝试都将返回在此初始化的实例。

不幸的是,它们永远不会与您在DI中描述为两个不同的东西的情况相同。DI可以理解“SomeInterfaceImplementation”属于“ISomeInterface”类型(正如您所说的),它应该是一个单例。然而,它不能知道“ISomeInterface”和“SomeInterfaceImplementation”应该是同一个单例。我建议总是注入接口,这样你就不会有这个问题了。同样感谢您,我试图以一种通过接口解决所有依赖关系的方式重写这些方法,非常有效!不幸的是,它们永远不会像您向DI描述的那样是两件不同的事情。DI可以理解“SomeInterfaceImplementation”属于“ISomeInterface”类型(正如您所说的),它应该是一个单例。然而,它不能知道“ISomeInterface”和“SomeInterfaceImplementation”应该是同一个单例。我建议总是注入接口,这样你就不会有这个问题了。同样感谢您,我试图以一种通过接口解决所有依赖关系的方式重写这些方法,非常有效!