I recently ran into a problem while using Entity Framework with Structuremap. The issue was mainly present while making concurrent calls to Web API endpoints, because they were all asynchronous. After a lot of investigation and looking around for various examples (mainly using other IOC containers), I came up with a solution.
My particular app is built to be somewhat modular, so this may be more complex than some need, but hopefully still helpful
##EntityFrameworkRegistry.cs
This is picked up by StructureMap on application startup as another “registry.”
public class EntityFrameworkRegistry : Registry
{
public EntityFrameworkRegistry()
{
var config = DataAccessConfig.GetConfig();
var dbConnName = config.Connection.ConnectionStringName;
For<IDbContext>().Use<MyDataContext()
.Ctor("nameOrConnectionstring").Is(dbConnName);
For(typeof(IRepository<>)).Use(typeof(EntityFrameworkRepository<>));
}
}
Basically, I’m getting my connection string (name of the connection string or the actual connection string itself) from the Web.config and injecting that into to the constructor of MyDataContext
. This seems to properly create the context so it creates a new instance per request.