REST Web API接口作为API调用中的参数

时间:2014-11-30 14:20:09

标签: asp.net rest asp.net-web-api interface dependency-injection

我正在使用ASP.NET WebAPI构建REST API。一切都运行良好,但后来我提出了在我的所有方法调用中使用接口的好主意。在我更改了所有方法后,我注意到在将Controller方法中的参数设置为接口后,我的API调用不起作用。我正在使用OWIN Self主机和Unity依赖注入。这是我的相关代码:

解析我的界面:

      IUnityContainer container = new UnityContainer();

      container.RegisterType<IMyInterface, MyInterfaceImpl>(new HierarchicalLifetimeManager());
      HttpConfiguration config = new HttpConfiguration();
      config.DependencyResolver = new UnityDependencyResolver(container);  

我的控制器(我收到错误的部分)

    [Route("test")]
    [HttpGet]
    public HttpResponseMessage GetSomeData([FromUri]IMyInterface searchObject)
    {
         return this._searchService.SearchForData(searchObject);

    }

调用此方法时,我收到无法创建接口的错误。我解读了,但问题在于修复它。我查看了ASP.NET Web API Operation with interfaces instead concrete class以及https://brettedotnet.wordpress.com/2014/07/16/web-api-and-interface-parameters/ASP.NET Web API Operation with interfaces instead concrete class,但在我的案例中没有提到任何建议(总是会收到无法创建界面的错误)。

我想知道是否有人在这样的事情上(在github或其他地方)有一个有效的例子,只是为了检查我做错了什么(或者甚至想知道我还能做些什么会很好)

谢谢

2 个答案:

答案 0 :(得分:2)

因为您要从查询字符串传递数据,所以此处需要采用不同的方法。在我引用的博客文章中,我没有包含该场景。由于查询字符串是通过模型绑定器处理的,因此您需要创建自定义模型绑定器。

在我的情况下,我选择创建一个IoCModelBinder,如下所示。

public class IocModelBinder : IModelBinder
{
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        var targetObject = ServiceLocator.Current.GetInstance(bindingContext.ModelType);
        var valueProvider = GlobalConfiguration.Configuration.Services.GetValueProviderFactories().First(item => item is QueryStringValueProviderFactory).GetValueProvider(actionContext);

        foreach (var property in targetObject.GetType().GetProperties())
        {
            var valueAsString = valueProvider.GetValue(property.Name);
            var value = valueAsString == null ? null : valueAsString.ConvertTo(property.PropertyType);

            if (value == null)
                continue;

            property.SetValue(targetObject, value, null);
        }

        bindingContext.Model = targetObject;
        return true;
    }
}

并在使用中

    /// <summary>
    /// Searches by the criteria specified.
    /// </summary>
    /// <param name="searchCriteriaDto">The search criteria dto.</param>
    /// <returns></returns>
    [HttpGet]
    public HttpResponseMessage Search([ModelBinder(typeof(IocModelBinder))]IApplicationSearchCriteriaDto searchCriteriaDto)
    {

    }

希望这有帮助。

Brette

答案 1 :(得分:0)

也许这会有所帮助: Parameter Binding in ASP.NET Web API
How to bind to custom objects in action signatures in MVC/WebAPI
您不能使用Formatter,因为您的数据来自URI。我想你可以从链接中使用Modelbinder approch。