Phil Wright
Phil Wright

Reputation: 22906

AutoRest from Swagger but reusing my existing assembly classes

I have a Windows UWP client application that needs to call a REST API hosted by my ASP.NET service. To generate my client proxy I use the following Visual Studio option...

Right click project -> Add -> REST API Client...

I provide the URL of the swagger endpoint and it generates the expected client code. But the downside is it generates all the classes even though in my case I have a shared class library that has all the server side classes defined. This is a pain because the generated classes do not respect the inheritance of my class hierarchy and flattens everything into non-inherited classes.

Is it possible to get AutoRest to reuse an existing .NET library for classes instead of always generating new classes? This was an option when I used the WCF client proxy generator.

Upvotes: 4

Views: 1169

Answers (2)

Stephen Kennedy
Stephen Kennedy

Reputation: 21548

I think it would be fair to describe the "REST API Client" generation tool in Visual Studio as "spartan".

This answer may be too late to help you, or there may be reasons why you can't use a different tool, but in the hope of benefiting you and/or future readers I'll detail how I achieved generating a REST client in NSwagStudio which reuses my existing classes and enums. (NSwagStudio is free and open source, and I have no affiliation).

On the left hand pane, we select our input. Besides the expected Swagger feeds there are some interesting options such as "Web API via reflection" which "uses .NET reflection to analyze ASP.NET Web API or ASP.NET Core controllers" - this is the option I used but my screenshot shows the default Swagger input.

enter image description here

On the right hand pane, click "CSharp Client" and switch to the "CSharp Client" tab.

The magic bullet is to untick "Generate DTO types":

enter image description here

This will cause it to generate only the client, so you can reuse your existing DTOs.

You'll want to specify a namespace for the client, and optionally one or more namespaces which will be added to the generated C# file as using directives. For example, if you want your client to be in the namespace MyNamespace and your model classes are in SomeOtherNamespace you'd enter the following:

enter image description here

It's well worth having a play with the options. A few quick notes about some of the defaults and why I'm happy with them:

  • The HttpClient is injected and you control the lifecycle (which seems to me a good thing)

  • A BaseUrl property is defined. I haven't tested this yet but I'm hopeful from looking at the generated code that this will allow me to safely spin up multiple instances of the client class to talk to multiple servers which share the same API

  • The JsonSerializerSettings property is protected, but can be configured via the UpdateJsonSerializerSettings partial method

I've saved my settings from the File menu and added the .nswag file to source control, so that I can easily regenerate the client in future if necessary.

Upvotes: 0

Sunteen Wu
Sunteen Wu

Reputation: 10627

It seems like Add REST API client doesn't have advanced setting for reusing. But Add REST API client has two ways for loading metadata file, swagger URL and existing metadata file. By testing on my site, it should be able to update an existing metadata file and to remove or adjust the nodes that you don't want be generated. And then load the updated existing metadata when adding REST API client.

The classes generated may be determined by the metadata json file and the host value. You may also try to submit a request here to see if swagger team can keep the hierarchy when generating the meta file. Or you may need to manual create the proxy to reuse the libraries.

Upvotes: 1

Related Questions