.net core netcore DI容器使用重载返回相同注册的不同实例
我在netcore的DI框架中遇到了一个问题。我知道在DI容器中注册类型的不同方法 具体来说,我对.net core netcore DI容器使用重载返回相同注册的不同实例,.net-core,.net Core,我在netcore的DI框架中遇到了一个问题。我知道在DI容器中注册类型的不同方法 具体来说,我对.AddSingleton方法感兴趣。这种方法有许多重叠 我的问题是,我想确保当我以不同的方式注册同一个类时(使用接口和类类型),然后创建两个实例,每个“注册”方式一个 假设我有一个名为ISomeInterface的接口,它的一个实现名为ImplementationOfSomeInterface 在我的例子中,我希望DI系统在请求某些接口的实现时创建一个实例。此外,在某些地方,我仅使用接口inter
.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”应该是同一个单例。我建议总是注入接口,这样你就不会有这个问题了。同样感谢您,我试图以一种通过接口解决所有依赖关系的方式重写这些方法,非常有效!