有兩個依賴解析器一個ASP.NET MVC和其他用於ASP.NET網頁API
網絡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<object> GetServices(Type serviceType)
{
return Container.GetAllInstances(serviceType).Cast<object>();
}
protected override IEnumerable<object> DoGetAllInstances(Type serviceType)
{
return Container.GetAllInstances(serviceType).Cast<object>();
}
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();
...
}
}