Невозможно правильно передать тип C# клиентскому коду в приложении F# WebSharper
У меня возникают проблемы при использовании определенного типа C# в веб-приложении F#. Следующий тип C# присутствует в библиотеке, на которую я ссылаюсь в моем приложении F#:
public static class OuterType
{
public class Model
{
private readonly string id;
private readonly bool selected;
private string name;
internal Model() : this(string.Empty) { }
public Model(string id) : this(id, false) { }
public Model(string id, bool selected)
{
this.id = name = id;
this.selected = selected;
}
[Localizable(false)]
public string ID => id;
public bool Selected => selected;
[Localizable(true)]
public string Name
{
get => name;
set => name = value;
}
}
}
Я написал прокси для него (как часть моего веб-приложения на F#):
[<Proxy(typeof<OuterType.Model>)>]
type ProxyModel =
{
ID : string
Selected : bool
Name : string
}
Мой проект компилируется нормально, но я получаю ошибку сериализации во время выполнения:
System.Exception: ошибка при преобразовании JSON RPC ---> System.Exception: не удалось найти переведенное имя поля для идентификатора в типе OuterType+Model с полями: Name, Selected, Id
Это привело меня к мысли, что конвертер ищет соответствие типу по именам полей. Поэтому я изменил свой прокси следующим образом:
[<Proxy(typeof<OuterType.Model>)>]
type ProxyModel =
{
id : string
selected : bool
name : string
}
Вышесказанное приводит к ошибке компиляции:
Ошибка WebSharper FS9001: Не удалось найти поле типа записи F#: OuterType.Model.Selected Ошибка WebSharper FS9001: Не удалось найти поле типа записи F#: OuterType.Model.Name
и я застрял Есть ли что-то, что я пропускаю?
Обновить:
Приложение ориентировано на netcoreapp2.1. Он использует следующие зависимости WebSharper (отрывок из моего paket.lock):
WebSharper (4.5.9.330)
WebSharper.AspNetCore (4.5.3.104)
WebSharper.FSharp (4.5.9.330)
WebSharper.Html (4.5.1.153)
WebSharper.Reactive (4.5.1.139)
WebSharper.UI (4.5.8.161)
0 ответов
Удаленное взаимодействие WebSharper использует отражение для создания / чтения объектов, поэтому, если они являются классами, они должны следовать правилам в https://developers.websharper.com/docs/v4.x/cs/remoting.
В этом случае единственное изменение, которое вам нужно, - это сделать конструктор без параметров общедоступным.
После этого вы можете использовать тип C# для RPC, но все же для использования на стороне клиента вам понадобится либо [JavaScript]
по типу (с пакетами WebSharper и WebSharper.CSharp, добавленными для проекта C#) или прокси, который хорошо ему соответствует, включая конструкторы, которые вы не сможете воспроизвести с помощью записи F#, вам может понадобиться класс.