如何覆盖WebAPI中的默认模型构造行为

时间:2013-09-16 21:09:30

标签: asp.net-web-api deserialization

我目前有一个项目,我正在利用自定义的业务对象库,我们希望根据需要通过WebAPI / WFC /等传递线程。我遇到的障碍之一是通过WebAPI处理对象的反序列化。

对象本身遵循工厂模式,因此,没有公共无参数构造函数(它们被标记为受保护)并使用Factory创建对象的实例。这样做有几个重要原因,但我们希望能够在不需要创建中间类/模型的情况下使用这些对象。

因此,当绑定模型时,WebAPI框架无法创建对象的实例,引用了“无参数构造函数”错误。我需要找到一种方法来调用工厂方法,并以某种方式将新对象返回到格式化程序或绑定程序(或其他一些反序列化过程的其他部分)。

是否有明确的方法(和文档)如何扩展Web API来处理这种情况,而不必在其上实现另一个框架?如果您能提供任何帮助,我将不胜感激。

修改 所以我开始创建一个新的Model Binder并通过BindModel()中的工厂类创建了该对象。通过将对象分配给bindingContext.Model然后手动反序列化对象,我能够实现所需,但我不确定它是否100%正确。

请参阅下面的代码:

Public Class FactoryModelBinder
    Implements IModelBinder

    Public Function MindModel(actionContext as HttpActionContext, bindingContext as ModelBindingContext) As Boolean Implements IModelBinder.BindModel

        Dim type = bindingModel.ModelType
        Dim attributes = type.GetCustomAttributes(FactoryAttribute, False)

        If attributes.Length > 0 Then

            Dim factoryAttribute As FactoryAttribute = DirectCast(attributes(0), FactoryAttribute)

            bindingContext.Model = factoryAttribute.FactoryType.InvokeMember("Create", BindingFlags.InokveMethod Or BindingFlags.Public Or BindingFlags.Static, Nothing, Nothing, Nothing)

            Dim data as FormDataCollection = New FormDataCollection(actionContext.Request.Content.ReadAsStringAsync().Result)
            Dim dict as NameValueCollection = data.ReadAsNameValueCollection()

            For Each item as String in dict.Keys

                Dim pi as PropertyInfo = bindingContext.Model.GetType().GetProperty(item)

                pi.SetValue(bindingContext.Model, dict(item), Nothing)

            Next

            Return True

        End If

        Return False

    End Function

此代码依赖于自定义属性(FactoryAttribute),该属性在对象类中指定工厂的类型,因此可用于调用Create()方法。

我很感激您的任何意见。

0 个答案:

没有答案