.NET中的依赖注入:如何在类中获取不是由DI服务容器创建的服务?

2vuwiymt  于 2023-02-26  发布在  .NET
关注(0)|答案(3)|浏览(168)

如何从DI服务容器的类中获取服务,这些类不能由容器本身示例化,因此我不能简单地为需要获取的服务声明带有适当参数的构造函数?是否需要在类之间传递对容器的引用,直到到达需要从容器中检索这些服务的类,或者是否有更智能的方法来检索对从我的应用程序代码中的任何地方调用容器?
下面添加一些细节,我最初的问题.
在我看来,有时候用DI容器注册所有的类是不值得的,而且您可能仍然需要从DI容器中检索某些类中的服务。然后我想知道是否有一个最佳实践来获取对DI容器的引用,而不是在类之间传递这个引用。
在大型或复杂的应用程序中,如何实现从任何类到DI容器的轻松访问,以获得所需的服务?

1dkrff03

1dkrff031#

您所询问的内容听起来像是服务定位器模式,通常被认为是反模式。
如果不知道为什么你认为你不能使用任何“正常”的DI方法,就很难确保给出一个关于如何做的答案真的是最好的方法。
但如果您坚持这样做,那么实现它的一种方法是在启动时“构建”服务提供程序(在您完成向服务集合添加服务之后),然后将该对象放入一个静态可访问的位置。
例如
MyServiceLocator.Instance = services.BuildServiceProvider();
然后从目标类中引用它,例如MyServiceLocator.Instance.GetRequiredService<T>();

bf1o4zei

bf1o4zei2#

我假设这个类有一些参数不能在DI容器中注册(例如,由于某种原因,它们在每个示例创建时都会发生变化)。您可以在这里使用工厂方法。例如,通过Func注册工厂:

services.AddScoped<Func<string, MyNonDiClass>>(serviceProvider =>
    s => new MyNonDiClass(serviceProvider.GetRequiredService<SomeDiParam>(), s));

class MyNonDiClass
{
    public MyNonDiClass(SomeDiParam p1, string nonDi)
    {
        // ..
    }
}

或者基本相同,但具有专用类,该类将具有CreateMyNonDiClass方法。

yuvru6vn

yuvru6vn3#

是的,您可以将IoC容器作为依赖项注入,但它通常被视为反模式。

public class MyFunkyClass
{
  public MyFunkyClass(IServiceProvider serviceLocator)
  {
    var dependency = serviceLocator.GetRequiredService<T>();
  }
}

相关问题