我目前有一个项目,我正在利用自定义的业务对象库,我们希望根据需要通过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()方法。
我很感激您的任何意见。