Changes
from ASP.NET MVC 4 Beta to RC
“Independently control IHttpController selection and activation: Implement the IHttpControllerSelector to control IHttpController selection. Implement IHttpControllerActivator to control IHttpController activation. The IHttpControllerFactory abstraction has been removed.” – This is the official statement from the ASP.NET MVC site. That means that you no longer may use the IHttpControllerFactory. Instead you get fine grained control over controller selection and activation by using to separate interfaces.
“Independently control IHttpController selection and activation: Implement the IHttpControllerSelector to control IHttpController selection. Implement IHttpControllerActivator to control IHttpController activation. The IHttpControllerFactory abstraction has been removed.” – This is the official statement from the ASP.NET MVC site. That means that you no longer may use the IHttpControllerFactory. Instead you get fine grained control over controller selection and activation by using to separate interfaces.
The
custom controller factory
For our controller factory we need to implement the IHttpControllerActivator. The interface has just a create method, used to create a certain controller:
For our controller factory we need to implement the IHttpControllerActivator. The interface has just a create method, used to create a certain controller:
public
class UnityControllerFactory
: IHttpControllerActivator
{
private readonly IUnityContainer
container;
private readonly DefaultHttpControllerActivator
defaultActivator;
public
UnityControllerFactory(IUnityContainer
container)
{
this.container
= container;
defaultActivator = new DefaultHttpControllerActivator();
}
public IHttpController Create(
System.Net.Http.HttpRequestMessage request,
HttpControllerDescriptor
controllerDescriptor,
Type
controllerType)
{
if(container.IsRegistered(controllerType))
{
return
container.Resolve(controllerType) as IHttpController;
}
return
defaultActivator.Create(request,
controllerDescriptor,
controllerType);
}
}
As you can see there’s a reference to the Unity container. Inside the Create method we first check, if the controller was registered with Unity or not. If it is not registered we will use a default activator to create the controller, otherwise it will be resolved using Unity.
Initializing
the controller factory
The custom Http controller factory needs to be registered with the Web API pipeline in order to use it for controller creation. The HttpConfiguration in ASP.NET Web API 4 RC does not contain a service resolver any more. Instead it contains a collection of services. The collection is a specialized one and is of type DefaultServices. This collection provides methods to get services or manipulate the collection. For example it has a replace method that can be used to replace a registered type in the collection with an own implementation. We can use this method to replace the standard controller activator with our own:
The custom Http controller factory needs to be registered with the Web API pipeline in order to use it for controller creation. The HttpConfiguration in ASP.NET Web API 4 RC does not contain a service resolver any more. Instead it contains a collection of services. The collection is a specialized one and is of type DefaultServices. This collection provides methods to get services or manipulate the collection. For example it has a replace method that can be used to replace a registered type in the collection with an own implementation. We can use this method to replace the standard controller activator with our own:
var
container = new UnityContainer();
container.RegisterType(typeof (Controllers.CustomerController));
var
factory = new UnityControllerFactory(container);
GlobalConfiguration.Configuration.Services.Replace(
typeof
(IHttpControllerActivator), factory);
That’s it. After registering your own factory this way it will be used for all requests to the Web API. There’s one disadvantage using this solution. When you create controllers with the Unity container you lose caching mechanisms that are built in the default Http controller activator. That means no controller objects are reused. You get a new instance on each API request. This disadvantage may be overcome by either configuring Unity to use Singleton objects or by implementing own caching machanisms.