Generic Host restricts Startup constructor injection · Issue #14900 · dotnet/docs (original) (raw)
Generic Host restricts Startup constructor injection
The only types the generic Host supports for Startup constructor injection are IHostEnvironment
, IWebHostEnvironment
, and IConfiguration
. Applications using WebHost
are unaffected.
In 3.0 we've re-platformed the web stack onto the generic host library. You can see the change in Program.cs in the templates:
2.x:
https://github.com/aspnet/AspNetCore/blob/5cb615fcbe8559e49042e93394008077e30454c0/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/Program.cs#L20-L22
3.0:
https://github.com/aspnet/AspNetCore/blob/b1ca2c1155da3920f0df5108b9fedbe82efaa11c/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/Program.cs#L19-L24
One key behavior change here is that Host only uses one dependency injection container to build the application, as opposed to WebHost that used one for the host and one for the app. As a result the Startup constructor no longer supports custom service injection, only IHostEnvironment
, IWebHostEnvironment
, and IConfiguration
can be injected. This change was made to avoid DI issues such as duplicate singleton services getting created.
Version introduced
3.0
Old behavior
The Startup constructor could constructor inject arbitrary types.
New behavior
The following types can be injected - IHostEnvironment
, IWebHostEnvironment
, and IConfiguration
Reason for change
This is a consequence of re-platting the web stack onto the generic host library.
Recommended action
You may mitigate this by inject services into Startup.Configure. For examplepublic void Configure(IApplicationBuilder app, IOptions<MyOptions> options)
Category
ASP.NET Core
Affected APIs
Application's Startup.
Issue metadata
- Issue type: breaking-change