Web Api:使用WebApiContrib.IoC.StructureMap.StructureMapResolver
MVC:使用StructureMapDependencyResolver
public class StructureMapDependencyResolver : StructureMapDependencyScope, IDependencyResolver { public StructureMapDependencyResolver(IContainer container) : base(container) { } public IDependencyScope BeginScope() { var child = Container.GetNestedContainer(); return new StructureMapDependencyResolver(child); } } public class StructureMapDependencyScope : ServiceLocatorImplBase, IDependencyScope { protected readonly IContainer Container; public StructureMapDependencyScope(IContainer container) { if (container == null) { throw new ArgumentNullException(nameof(container)); } Container = container; } public void Dispose() { Container.Dispose(); } public override object GetService(Type serviceType) { if (serviceType == null) { return null; } return serviceType.IsAbstract || serviceType.IsInterface ? Container.TryGetInstance(serviceType) : Container.GetInstance(serviceType); } public IEnumerable GetServices(Type serviceType) { return Container.GetAllInstances(serviceType).Cast(); } protected override IEnumerable DoGetAllInstances(Type serviceType) { return Container.GetAllInstances(serviceType).Cast(); } protected override object DoGetInstance(Type serviceType, string key) { if (string.IsNullOrEmpty(key)) { return serviceType.IsAbstract || serviceType.IsInterface ? Container.TryGetInstance(serviceType) : Container.GetInstance(serviceType); } return Container.GetInstance(serviceType, key); } }
用法如下……
public static class Ioc { public static void Config() { var container = InitializeContainer(); var webApiDependencyResolver = new StructureMapResolver(container); GlobalConfiguration.Configuration.DependencyResolver = webApiDependencyResolver; var mvcDependencyResolver = new StructureMapDependencyResolver(container); DependencyResolver.SetResolver(mvcDependencyResolver); } } public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { Ioc.Config(); ... } }