确保控制器具有无参数的公共构造函数,Microsoft Unity无法解析参数

时间:2017-03-14 18:15:49

标签: c# asp.net-web-api unity-container ioc-container

我最近使用Web API模板创建了一个示例应用程序。我还安装了Microsoft Unity Mvc软件包并添加了一个测试服务,如下所示:

public interface IUtilityService
{
    string GetToken(int length);
}

public class UtilityService : IUtilityService
{
    public string GetToken(int length)
    {
        return "ABC";
    }
}

UnityConfigUnityWebActivator只是通过安装软件包创建的,我刚刚在其中注册了自己的服务,如下所示:

public static class UnityWebActivator
{
    /// <summary>Integrates Unity when the application starts.</summary>
    public static void Start() 
    {
        var container = UnityConfig.GetConfiguredContainer();

        FilterProviders.Providers.Remove(
            FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
        FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

        DependencyResolver.SetResolver(new UnityDependencyResolver(container));

        // TODO: Uncomment if you want to use PerRequestLifetimeManager
        // Microsoft.Web.Infrastructure.DynamicModuleHelper
        //  .DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
    }

    /// <summary>Disposes the Unity container when the application is shut down.</summary>
    public static void Shutdown()
    {
        var container = UnityConfig.GetConfiguredContainer();
        container.Dispose();
    }

UnityConfig:

public class UnityConfig
{
    #region Unity Container
    private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
    {
        var container = new UnityContainer();
        RegisterTypes(container);
        return container;
    });

    public static IUnityContainer GetConfiguredContainer()
    {
        return container.Value;
    }
    #endregion

    public static void RegisterTypes(IUnityContainer container)
    {
        // NOTE: To load from web.config uncomment the line below. Make sure to 
        // add a Microsoft.Practices.Unity.Configuration to the using statements.
        // container.LoadConfiguration();

        // TODO: Register your types here
        container.RegisterType<IUtilityService, UtilityService>();
    }
}

一旦我运行测试应用程序,Microsoft Unity就会在Home控制器中解析我的服务,但是,一旦我想从JQuery调用Values控制器中的方法,它就无法解析服务。

代码如下:

private readonly IUtilityService utilityService;

public HomeController(IUtilityService utilityService)
{
    this.utilityService = utilityService;
}

public ActionResult Index()
{
    ViewBag.Title = utilityService.GetToken(10);

    return View();
}

值控制器如下:

private readonly IUtilityService utilityService;

public ValuesController(IUtilityService utilityService)
{
    this.utilityService = utilityService;
}

// GET api/values
public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}

这也是我称之为值控制器的jquery代码:

 $(document).ready(function () {
    console.log("ready!");

    $('#call').click(function () {
        $.ajax({
            type: "GET",
            dataType: 'json',
            url: "api/Values",
            success: function (response) {
                console.log("success!");
            },
            error: function (response, textStatus, errorThrown) {
                console.log("error!");
            }
        });
    })
});

我点击按钮运行ajax调用值控制器我得到下面的错误,似乎控制器无法启动,因为没有参数较少的构造函数。

错误:

  

尝试创建类型的控制器时发生错误   'ValuesController'。确保控制器具有无参数   公共建设者。

1 个答案:

答案 0 :(得分:1)

这是一个常见的无用错误消息,通常表示框架在初始化时无法解析控制器的依赖关系。

在这种情况下,您需要为Web API设置DependencyResolver。 MVC和Web API都有依赖项解析器,但它们属于不同的命名空间。正如评论中已经提到的,您需要在配置Web API时设置HttpConfiguration的依赖项解析程序。

public static class WebApiConfig {

    public static void Register(HttpConfiguration config) {

        var container = UnityConfig.GetConfiguredContainer();

        //...any other settings to be applied to container.

        config.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);

        //...other code removed for brevity
    }
}