Does the current version of StructureMap support ASP .Net Web API, MVC 4 and .NET Framework 4.5?
As outlined here, the web API uses a dependency resolver.
class StructureMapDependencyResolver : IDependencyResolver
{
public IDependencyScope BeginScope()
{
return this;
}
public object GetService(Type serviceType)
{
return ObjectFactory.GetInstance(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return ObjectFactory.GetInstances(serviceType);
}
public void Dispose()
{
}
}
And in your Global.asax.cs, include this line to register the dependency resolver:
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver();
Aside from that, the new Web API is very easy to use with IoC containers.
I haven't looked into it yet, but I believe the BeginScope
method that I left blank can be used with child containers.
Edit:
The above implementation works great; in fact I prefer it over the alternative I'm about to tell you. This one will resolve any Type to the best of StructureMap's abilities and will throw errors whenever something goes wrong. I like seeing errors because they show me what I did wrong.
However, the API expects that GetService
will return null if something goes wrong. So to be compliant with the API, this is the recommended implementation:
public object GetService(Type serviceType)
{
if (serviceType.IsAbstract || serviceType.IsInterface)
return ObjectFactory.TryGetInstance(serviceType);
else
return ObjectFactory.GetInstance(serviceType);
}
The difference is that TryGetInstance
only looks for types registered in the container and will return null if something goes wrong. serviceType.IsAbstract || serviceType.IsInterface
is considered good enough of a check to decide which method to use. My original answer was intended to be straightforward and simple, but @PHeiberg points out in the comments here that it wasn't entirely "correct". Now that you have knowledge, use whatever seems best.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With