Faced with this question myself, this was the best guide I could find for registering StructureMap using the ASP.NET MVC Dependency Resolver (via the CommonServiceLocator package ).
I copied and pasted the above solution for the article, but I would recommend taking advantage of this solution in the original article.
public class StructureMapDependencyResolver : ServiceLocatorImplBase { private const string StructuremapNestedContainerKey = "Structuremap.Nested.Container"; public IContainer Container { get; set; } private HttpContextBase HttpContext { get { var ctx = Container.TryGetInstance<HttpContextBase>(); return ctx ?? new HttpContextWrapper(System.Web.HttpContext.Current); } } public IContainer CurrentNestedContainer { get { return (IContainer)HttpContext.Items[StructuremapNestedContainerKey]; } set { HttpContext.Items[StructuremapNestedContainerKey] = value; } } public StructureMapDependencyResolver(IContainer container) { Container = container; } protected override IEnumerable<object> DoGetAllInstances(Type serviceType) { return (CurrentNestedContainer ?? Container).GetAllInstances(serviceType).Cast<object>(); } protected override object DoGetInstance(Type serviceType, string key) { var container = (CurrentNestedContainer ?? Container); if (string.IsNullOrEmpty(key)) { return serviceType.IsAbstract || serviceType.IsInterface ? container.TryGetInstance(serviceType) : container.GetInstance(serviceType); } return container.GetInstance(serviceType, key); } public void Dispose() { if (CurrentNestedContainer != null) { CurrentNestedContainer.Dispose(); } Container.Dispose(); } public IEnumerable<object> GetServices(Type serviceType) { return DoGetAllInstances(serviceType); } public void DisposeNestedContainer() { if (CurrentNestedContainer != null) CurrentNestedContainer.Dispose(); } public void CreateNestedContainer() { if (CurrentNestedContainer != null) return; CurrentNestedContainer = Container.GetNestedContainer(); } }
Then you can set the resolver like this:
public class MvcApplication : System.Web.HttpApplication { public static StructureMapDependencyResolver StructureMapResolver { get; set; } protected void Application_Start() { ...
An excellent result of this type of configuration is to get a new child container for each request, and the container is deleted at the end of each request.
source share