Глубокое клонирование объектов из сгенерированного Autorest кода - PullRequest
0 голосов
/ 31 января 2019

Я использую Авторест для генерации кода для вызова моего API.

Я хочу использовать следующее в своих модульных тестах

    private JobHeaderRequestObject MakeRequestFromResponse(JobHeaderResponseObject InResponseObject)
{
    // make use of the fact that in the server side code we know  JobHeaderResponseObject inherits from JobHeaderRequestObject 
    return MySerializer.DeepConvert<JobHeaderResponseObject,JobHeaderRequestObject>(InResponseObject);
}


internal class MySerializer
{

    public static T2 DeepConvert<T1,T2>(T1 obj)
    {
        using (var ms = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(ms, obj);
            ms.Position = 0;
            return (T2)formatter.Deserialize(ms);
        }
    }
}

Однако, когда я пытаюсь запустить этот код, я получаюошибка с упоминанием

System.Runtime.Serialization.SerializationException   

, указывающая, что тип

is not marked as serializable

Я не хочу проходить через сгенерированный код, добавляя атрибут

[Serializable]

для каждого типа, потому что код будет перезаписан при следующем генерировании.

Я рассмотрел эту проблему в проекте Git Hub и упоминает

Если у спецификации сваггера есть определение модели, подобное этому

{
  "Foo": {
    "properties": {
      "name": {
        "type": "string"
      },
      "age": {
        "type": "number"
      }
    },
    "additionalProperties": {
      "type": "string"
    }
  }
}

, то сгенерированные Autorest SDK должны иметь возможность сериализовать и десериализовать (в оба конца) неизвестные свойства правильно.

Созданные клиенты C # поддерживают это сегодня, имея словарь AdditionalProperties.

Итак, теперь я пытаюсь понять, что такое спецификация Autorest и как я ее настроил.

В startup.cs у меня в настройках35 *

            app.UseSwagger(c =>
        {
            c.RouteTemplate =
                "api-docs/{documentName}/swagger.json";
        });



        app.UseSwaggerUI(c =>
        {
            //Include virtual directory if site is configured so
            c.RoutePrefix = "api-docs";
            c.SwaggerEndpoint("./v1/swagger.json", "Api v1");

        });

В ConfigureServices у меня есть

        services.AddSwaggerGen(c =>
        {
            c.OperationFilter<AuthorizationHeaderParameterOperationFilter>();
            c.SwaggerDoc("v1", new Info
            {
                Version = "v1",
                Title = "My API",
                Description = "ASP.NET Core Web API",
                TermsOfService = "None",
                Contact = new Swashbuckle.AspNetCore.Swagger.Contact
                {
                    Name = "MyName",
                    Email = "MyEmail@Mydomain.com"
                }


            });

            c.EnableAnnotations();
            c.DescribeAllEnumsAsStrings();
            c.ParameterFilter<SwaggerEnumParameterFilter>();
            c.SchemaFilter<SwaggerEnumFilter>();
        });
...