【问题标题】:Make sure that the controller has a parameterless public constructor, Microsoft Unity can not resolve parameters确保控制器有无参数的公共构造函数,Microsoft Unity 无法解析参数
【发布时间】:2017-03-14 18:15:48
【问题描述】:

我最近使用 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" };
}

这也是我调用 Values 控制器的 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 调用,我收到以下错误,似乎控制器无法启动,因为没有参数少的构造函数。

错误:

尝试创建类型控制器时出错 '值控制器'。确保控制器具有无参数 公共构造函数。

【问题讨论】:

  • 你在WebApiConfig.cs中的HttpConfiguration.DependencyResolver中添加了unity容器了吗?
  • 我认为UnityWebActivator类中的这行代码应该足够了。 DependencyResolver.SetResolver(new UnityDependencyResolver(container));

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


【解决方案1】:

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

在这种情况下,您需要为 Web API 设置 DependencyResolver。 MVC 和 Web API 都有依赖解析器,但它们属于不同的命名空间。在 cmets 中已经提到,您需要在配置 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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多