Dot-Net

.NET Core 2.0 Autofac 註冊類 InstancePerRequest 不起作用

  • February 9, 2018

這是我的界面

public interface IMatchServices
{
   string MatchList();
}

在這裡上課

public class MatchServices : IMatchServices
{
   public string MatchList() {

       return "test";
   }
}

控制器

public class SearchController : Controller
{
   private readonly IMatchServices matchservices;

   public SearchController(IMatchServices matchservices)
   {
       this.matchservices = matchservices;
   }

   [Route("matchlist")]
   public string MatchList() {

       return matchservices.MatchList();
   }
}

ConfigureService

public IServiceProvider ConfigureServices(IServiceCollection services)
{
   services.AddMvc();
   ContainerBuilder builder = new ContainerBuilder();
   builder.RegisterType<MatchServices>().As<IMatchServices>().SingleInstance();
   builder.Populate(services);
   var container = builder.Build();
   return container.Resolve<IServiceProvider>();
}

最後是錯誤(當我註冊時InstancePerRequest):

Autofac.Core.DependencyResolutionException:無法解析類型“xxx.Services.MatchServices”,因為無法找到它所屬的生命週期範圍。此註冊公開了以下服務: - xxx.Interfaces.IMatchServices

詳細資訊—>從請求實例的範圍中看不到帶有與“AutofacWebRequest”匹配的標記的範圍。

如果您在執行 Web 應用程序期間看到這種情況,這通常表明註冊為 per-HTTP 請求的組件正在被 SingleInstance() 組件(或類似場景)請求。在 Web 集成下,總是從依賴解析器或請求生命週期範圍請求依賴,而不是從容器本身。(有關詳細資訊,請參閱內部異常。)—> Autofac.Core.DependencyResolutionException:從請求實例的範圍中看不到帶有匹配“AutofacWebRequest”的標記的範圍。

當我註冊 MatchServices 類SingleInstance時,它正在工作但InstancePerRequest沒有工作。為什麼?我什至沒有在MatchServices.

根據Autofac 文件

使用 InstancePerLifetimeScope 而不是 InstancePerRequest。在以前的 ASP.NET 集成中,您可以註冊一個依賴項,InstancePerRequest這樣可以確保每個 HTTP 請求只創建一個依賴項實例。這是因為 Autofac 負責設置每個請求的生命週期範圍。隨著Microsoft.Extensions.DependencyInjection. 而不是註冊您的依賴項InstancePerRequest,使用InstancePerLifetimeScope並且您應該獲得相同的行為。請注意,如果您在 Web 請求期間創建自己的生命週期範圍,您將在這些子範圍中獲得一個新實例。

此外,您還有另一個問題

請注意,這Populate基本上是一個將東西添加到集合中的 Autofac 的 foreach。如果你在 Autofac BEFORE 中註冊了東西,Populate那麼裡面的東西 ServiceCollection可以覆蓋這些東西;如果您Populate在這些註冊之後註冊,則可以覆蓋ServiceCollection. 根據需要混合和匹配。

換句話說,這些行的順序也有誤:

builder.Populate(services);
builder.RegisterType<MatchServices>().As<IMatchServices>().InstancePerLifetimeScope();

引用自:https://stackoverflow.com/questions/48705473