Невозможно правильно проксировать тип 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: ошибка при преобразовании RPC JSON ---> 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 (выдержка из моего пакета.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)

person Ivaylo Slavov    schedule 26.02.2019    source источник


Ответы (1)


Удаленное взаимодействие WebSharper использует отражение для создания/чтения объектов, поэтому, если они являются классами, они должны следовать правилам в https://developers.websharper.com/docs/v4.x/cs/remoting#heading-6.

В этом случае единственное изменение, которое вам нужно, — это сделать конструктор без параметров общедоступным.

После этого вы можете использовать тип C# для RPC, но для использования на стороне клиента вам потребуется либо [JavaScript] для типа (с пакетами WebSharper и WebSharper.CSharp, добавленными для проекта C#), либо соответствующий прокси-сервер. Это хорошо, включая конструкторы, которые вы не сможете воспроизвести с помощью записи F #, вам может понадобиться класс.

person Jand    schedule 15.05.2019
comment
Спасибо за ответ, @Jand. Можете ли вы подтвердить общедоступный конструктор без параметров, необходимый при использовании типа прокси, который я делаю? Мои ошибки скорее указывают на неверный перевод имени поля/свойства, а не на общую невозможность сопоставления типа. - person Ivaylo Slavov; 16.05.2019