簡體   English   中英

在 asp.net core 3.1 中使用 Autofac 的 ServiceLocator

[英]ServiceLocator with Autofac in asp.net core 3.1

我正在開發一個 asp.net core 3.1 webapi 應用程序,我使用 Autofac 作為 DI 容器。 對於一種特殊情況,我不能使用 ConstructorInjection、propertyinjection 或 methodinjection。 我唯一的方法是在 Autofac 的支持下實現一種 ServiceLocator 模式。

*我知道服務定位器是一種反模式,但只有當它是唯一的機會時我才會使用它*

說,我創建了一個小靜態類:

public static class ServiceLocator
{

    private static XXXX Resolver;

    public static T Resolve<T>()
    {
        return Resolver.Resolve<T>();
    }

    public static void SetCurrentResolver(XXXX resolver)
    {
        Resolver = resolver;
    }
}

我在 Resolver 屬性的類型上寫了 XXXX,因為我不知道要使用哪個 Autofac 類。 Startup.cs的Configure方法中會調用SetCurrentResolver方法

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILifetimeScope serviceProvider)
    {
        //OTHER STUFF NOT RELATED HERE

        ServiceLocator.SetCurrentResolver(serviceProvider);
    }

我試圖傳遞 ILifetimeScope 的實例,但是當我稍后在服務定位器中使用它時,它將被處理,然后不起作用。 我想傳遞一個 IContainer 對象,但我無法在 Startup.cs 中檢索實例(無論是在Configure方法中還是在ConfigureContainer 中

我報告 ConfigureContainer 方法完成

    public void ConfigureContainer(ContainerBuilder builder)
    {
        //first register the dependency for WebApi Project

        builder.RegisterType<HttpContextUserService>().As<IUserService>().SingleInstance();

        //and then register the dependency for all other project

        var appConfiguration = new AppConfiguration();
        Configuration.GetSection("Application").Bind(appConfiguration);
        builder.RegisterInstance(appConfiguration).SingleInstance();

        builder.RegisterModule(new DependencyInjectionBootstrapper(appConfiguration)); 
        
    }

任何人都可以幫我解決這個問題嗎?

謝謝

如果您查看示例,這實際上在 Autofac 文檔中得到了回答

這是相關的位。

public class Startup
{
  public Startup(IHostingEnvironment env)
  {
    // Body omitted for brevity.
  }

  public ILifetimeScope AutofacContainer { get; private set; }

  public void ConfigureServices(IServiceCollection services)
  {
    // Body omitted for brevity.
  }

  public void ConfigureContainer(ContainerBuilder builder)
  {
    // Body omitted for brevity.
  }

  public void Configure(IApplicationBuilder app)
  {
    // If, for some reason, you need a reference to the built container, you
    // can use the convenience extension method GetAutofacRoot.
    // THIS IS WHERE YOU'D SET YOUR SERVICE LOCATOR.
    this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM