.NET Core 2.0 Autofac 註冊類 InstancePerRequest 不起作用
這是我的界面
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(); } }和
ConfigureServicepublic 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();