-
Notifications
You must be signed in to change notification settings - Fork 29
Support ASP.NET Core 3.0 #47
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Was a PR created for this? Is there going to be? |
We'll gladly accept a PR to support ASP.NET Core 3 |
It looks as if it works as long as you use some of the same patterns as a .net core 2.1 webapp. Use the old format for program.cs. |
Any progress on this? |
Best bet is probably to migrate over Lamar instead since StructureMap is sunsetted @juanjoDiaz . |
For those running into this issue, here's what I did to get this to work with the new HostBuilder on netcoreapp3.1. Some of this was taken from Autofac's docs. Program.cs: public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new StructureMapContainerBuilderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}); Startup.cs: public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
public void ConfigureContainer(Container builder)
{
builder.Configure(config =>
{
// Your services here
config.AddRegistry(new MyRegistry());
});
} The registry: public class MyRegistry : Registry
{
public MyRegistry()
{
For<Something>().Singleton().Use<Something>();
}
} StructureMapContainerBuilderFactory.cs public class StructureMapContainerBuilderFactory : IServiceProviderFactory<Container>
{
private IServiceCollection _services;
public Container CreateBuilder(IServiceCollection services)
{
_services = services;
return new Container();
}
public IServiceProvider CreateServiceProvider(Container builder)
{
builder.Configure(config =>
{
config.Populate(_services);
});
return builder.GetInstance<IServiceProvider>();
}
} |
@dustinsoftware The library already provides a public static class HostBuilderExtensions
{
public static IHostBuilder UseStructureMap(this IHostBuilder builder)
{
return UseStructureMap(builder, registry: null);
}
public static IHostBuilder UseStructureMap(this IHostBuilder builder, Registry registry)
{
return builder.UseServiceProviderFactory(new StructureMapServiceProviderFactory(registry))
}
} Then call it: public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseStructureMap(new MyRegistry()/* optional */);
.ConfigureWebHostDefaults(web => web.UseStartup<Startup>()); You can choose to pass a registry instance from outside (as shown in this example), or you can configure it inside the public void ConfigureContainer(Registry registry)
{
// Your services here
} |
There are lots of changes in ASP.NET Core 3.0 and breaks StructureMap.Microsoft.DependencyInjection. The new framework dropped the support for configuring third-party DI containers via ConfigureServices, which, returns an IServiceProvider class. Now, developers who use StructureMap.MicrosoftDependencyInjection must use the other method of wiring up the DI container. That is, by using the StructureMap.AspNetCore extensions. However, the current version is still using the IWebHostBuilder and it needs to be migrated to IHostBuilder to support ASP.NET 3.0. The code below shows the current implementation of the ServiceCollectionExtensions and WebHostBuilderExtensions. The former extension class need not to return an IServiceCollection since it's not supported in ASP.NET Core 3 and instead, return a void. Meanwhile, the WebHostBuildExtensions class must call the UseServiceProviderFactory before calling the ConfigureServices method.
Current solution:
Proposed solution:
The text was updated successfully, but these errors were encountered: