如何使用Unity在web api 2.0中进行构造函数级别的DI

时间:2015-08-19 09:32:52

标签: c# asp.net-web-api dependency-injection

我使用Unity通过创建自定义控制器激活器类在ASP.Net MVC中执行依赖注入,

 public class CustomControllerActivator : IControllerActivator
{
    public IController Create(RequestContext requestContext, Type controllerType)
    {
        var controller = default(IController);
        if (controllerType != default(Type))
        {
            controller = ServiceLocator.Current.GetInstance(controllerType) as IController;
        }
        return controller;
    }
}

然后是一个自定义依赖控制器解析器类,如下所示,

 public class CustomControllerDependencyResolver : IDependencyResolver
{
    public object GetService(Type serviceType)
    {
        var resolvedObject = default(object);
        if (serviceType == typeof(IControllerActivator))
        {
            resolvedObject = new CustomControllerActivator();
        }

        return resolvedObject;
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        var resolvedObjects = default(IEnumerable<Object>);

        resolvedObjects = ServiceLocator.Current.GetInstances(serviceType);
        return resolvedObjects;
    }
}

然后我将以下行添加到global.asax.cs文件,

DependencyResolver.SetResolver(new CustomControllerDependencyResolver());

注册我的自定义依赖项解析程序。

上述方法适用于MVC控制器,但是当我以前为webapi控制器执行相同操作时,它失败了, 尝试创建“CustomerController”类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。

1 个答案:

答案 0 :(得分:0)

问题是MVC和Webapi正在通过他们自己的DI工作,所以它从控制器的构造函数创建对象,它必须是pram-less,但是当你试图创建自己的param构造函数时,这取决于你的DI ,你需要安装学习MVC或Webapi的配置来处理你的DI 在你的情况下,你使用Unity,所以你必须安装unity.webapi 这是代码:

  

PM&GT;安装包Unity.WebAPI -Version 0.10.0