1

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

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

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

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

编辑: 所以我创建了一个新的模型绑定器,并通过 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() 方法。

我很感激对此的任何意见。

4

0 回答 0