Step 1: Create a new ASP.NET Web application
Step 2: Install Unity through Nuget
At the current time of writing the version used in the Package Manager Console was as follows:
PM> Install-Package Unity -Version 5.7.3
Step 3: Create a new repository
We add this to the Model folder.
When creating the controller in the constructor, We like to specify that we would like an interface to the repository – eg when we come to specify tests at a later stage, when don’t have to specify a specific repository, we can be much more de-coupled, but mainly to abstract it out for testing.
In this example my ‘repository’ is just a property that returns a list of strings.
IRepository.cs
using System.Collections.Generic;
namespace WebApiDepInject.Models
{
public interface IRepository
{
IEnumerable<string> MyValues { get; set; }
}
}
Repository.cs
using System.Collections.Generic;
namespace WebApiDepInject.Models
{
public class Repository : IRepository
{
public IEnumerable<string> MyValues { get; set; }
public Repository()
{
MyValues = new List<string> {"Value1", "Value2", "Value3", "Value4"};
}
}
}
Step 4: Create a class for resolving dependencies
using System;
using System.Collections.Generic;
using System.Web.Http.Dependencies;
using Unity;
using Unity.Exceptions;
namespace WebApiDepInject.Models
{
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();
}
}
}
Step 5: Update the WebApiConfig class
i. initialise the UnityContainer
ii. set the dependency resolver
WebApiConfig.cs
using System.Web.Http;
using Unity;
using WebApiDepInject.Models;
namespace WebApiDepInject
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var container = new UnityContainer();
container.RegisterType<IRepository, Repository>();
config.DependencyResolver = new UnityResolver(container);
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
"DefaultApi",
"api/{controller}/{id}",
new { id = RouteParameter.Optional }
);
}
}
}
Step 6: Modify the Values controller
ValuesController.cs
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using WebApiDepInject.Models;
namespace WebApiDepInject.Controllers
{
public class ValuesController : ApiController
{
private readonly IRepository _repo;
public ValuesController(IRepository repo)
{
_repo = repo;
}
// GET api/values
public IEnumerable<string> Get()
{
return _repo.MyValues;
}
// GET api/values/5
public string Get(int id)
{
var list = _repo.MyValues.ToList();
if (id >= 0 && id < list.Count)
{
return list[id];
}
return "unknown";
}
}
}
Step 7: Try it
Build and run the problem. It will open up the service link within a browser:
Now try it with the GET command to return the list of strings using the link: http://localhost:52547/api/Values (replace the 52547 port number with your version obviously)
And by getting the 3rd item in the list by index using the link: http://localhost:52547/api/Values/2




Comments
One response to “Using dependency injection in Web API applications using Unity”
getting this error Exception of type ‘System.StackOverflowException’ was thrown.