我正在使用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或其他地方)有一个有效的例子,只是为了检查我做错了什么(或者甚至想知道我还能做些什么会很好)
谢谢
答案 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。