ASP.NET Core ConfigureServices中不使用BuildServiceProvider获取服务实例的方法
解决方案
你可以使用ASP.NET Core自带的Options配置体系的带依赖注入重载,完全避免手动构建ServiceProvider,也不需要手动实例化CustomTicketStore:
步骤1:保留原有的服务注册代码
// 注册自定义TicketStore services.AddSingleton<ITicketStore, CustomTicketStore>();
步骤2:修改Cookie认证配置逻辑
不要在AddCookie的委托里直接获取服务,改为通过OptionsBuilder的泛型Configure方法注入已注册的ITicketStore:
services.AddAuthentication("Cookies") .AddCookie("Cookies"); // 注入ITicketStore配置Cookie选项 services.AddOptions<CookieAuthenticationOptions>("Cookies") .Configure<ITicketStore>((options, ticketStore) => { options.SessionStore = ticketStore; });
原理解释
这种写法的优势在于:
Configure方法泛型参数声明的依赖,会在容器完全构建完成后、第一次使用CookieAuthenticationOptions时自动从容器中解析,不会生成额外的容器副本,完全消除官方警告- 不需要手动处理
CustomTicketStore的构造函数依赖,所有依赖(比如你示例中的AuthRepository、OracleConnection)只要提前注册到服务容器中,就会自动注入,代码更简洁易维护
注意:需要确保
CustomTicketStore构造函数中所有依赖项都已提前注册到服务容器中,AddOptions的参数需要和AddCookie的认证方案名保持一致。
内容的提问来源于stack exchange,提问作者Sameer
相关产品推荐
相关产品推荐

