I am trying to implement the dependency injection in ASP.Net web API with unity container and have implemented the exactly with below 2 articles:
- https://stackoverflow.com/a/38770689/3698716
- https://learn.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection
Both are related to each other with some minor change but implementation for both are same.
After implementing my code is breaking at return _container.Resolve(serviceType);
with stackoverflow exception in the GetService method of the UnityResolver.cs class, below is the exception I am getting:
System.StackOverflowException: 'Exception of type 'System.StackOverflowException' was thrown.'
Is there any idea about that?
My UnityConfig.cs
public static class UnityConfig
{
public static UnityContainer Config()
{
UnityContainer container = new UnityContainer();
container.RegisterType<IProduct, ProductBLL>();
return container;
}
}
My WebApiConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
var container = UnityConfig.Config();
config.DependencyResolver = new UnityResolver(container);
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
And My UnityResolver.cs
public class UnityResolver : IDependencyResolver
{
private readonly IUnityContainer _container;
public UnityResolver(IUnityContainer container)
{
_container = container;
}
public object GetService(Type serviceType)
{
try
{
return _container.Resolve(serviceType);
}
catch (ResolutionFailedException)
{
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return _container.ResolveAll(serviceType);
}
catch (ResolutionFailedException)
{
return new List<object>();
}
}
public IDependencyScope BeginScope()
{
var child = _container.CreateChildContainer();
return new UnityResolver(child);
}
public void Dispose()
{
_container.Dispose();
}
}
And My PracticeController.cs
public class PracticeController : ApiController
{
private IProduct objProduct;
public PracticeController(IProduct product)
{
this.objProduct = product;
}
[HttpGet]
public string TestPractice()
{
string val = objProduct.InsertData();
Console.WriteLine(val);
Console.ReadLine();
return val;
}
}