Codeworx.Rest

Open Source Asp.net Core Erweiterung

In beinahe all unseren Projekten ist asp.net core als performante und robuste Servertechnologie nicht mehr weg zu denken. Sowohl für Web-, als auch Full-Clients ist eine stabile Rest Datenzugriffs-Schicht eine der grundlegendsten Mindestanforderungen. Speziell in der Portierung älterer Projekte, welche ursprünglich mit WCF Serviceschichten erstellt wurden, sind wir immer wieder vor der gleiche Aufgabe gestanden, den Technologiewechsel so kompromisslos wie möglich zu vollziehen, gleichzeitig jedoch den Komfortverlust für die Entwickler so gering wie möglich zu halten.

asp.net Core in Web Projekten

Ein gut etablierter Workflow für die Entwicklung mit Angular, ist die Verwendung von Swagger als Übersetzter der Rest Metainformation aus dem auf C# basierten .net Backend in das auf Typescript aufbauende Angular Frontend. Quelle für diese Metadaten sind im Standard Setup von asp.net Core MVC Attribute, welche auf den Controller Klassen definiert werden.

    [Route("/api/[controller]")]
    public class SampleController
    {
        [HttpGet()]
        async Task<IEnumerable<SampleData>> GetItemsAsync()
        {
            ...
        }

        [HttpDelete("{id}")]
        async Task DeleteItemAsync(Guid id)
        {
            ...
        }
    }

Daraus ergeben sich aus Sicht der Software Architektur einige Limitierungen.

  • Route, HttpGet, HttpDelete,… kommen aus asp.net core spezifischen Assemblies und sind daher in netstandard Bibliothenken nicht verfügbar.
  • Es gibt keine Möglichkeit mehr, ein Contract basiertes Design wie z.B. in WCF zu verwenden. (z.B. interface ISampleController -> SampleController : ISampleController)

Codeworx.Rest.AspNetCore

Mit diesem, auf nuget.org zur Verfügung gestellten Paket, können Sie dieses Contract basierte Design nun auch in asp.net Core verwenden. Daher ist es ein Leichtes, bestehenden WCF Code mit wenig Aufwand nach asp.net core zu portieren.

  • Aktivierung in startup.cs
          public void ConfigureServices(IServiceCollection services)
          {
              services
                  .AddControllers()
          }
    
  • Contract interface
      [RestRoute("/api/[controller]")]
      public interface ISampleController 
      {
          [RestGet]
          Task<IEnumerable<SampleData>> GetItemsAsync();
    
          [HttpDelete("{id}")]
          Task DeleteItemAsync(Guid id);
      }
    
  • Implementierung
      public class SampleController : ISampleController
      {
          public async Task<IEnumerable<SampleData>> GetItemsAsync()
    
          public async Task DeleteItemAsync(Guid id)
      }
    

Die daraus resultierende REST Schnittstelle ist in beiden Fällen ident. In dieser Variante kann sowohl das Interface, als auch die Implementierung in einer netstandard Bibliothek liegen. Die übersetztung der Metadaten erfolgt dann im Hosting durch die mit .AddRestContract() registrierten Dienste.

asp.net Core in Full Client Projekten

Natürlich kann auch hier Swagger als Übersetzer verwendet werden, um die passenden Zugriffsbibliotheken zu generieren. Meist gib es in diesem Szenario bereits gemeinsam verwendete Bibliotheken, da sowohl Server, als auch Client mit .net entwickelt werden.

Wie praktisch wäre es nun, diese Bibliotheken für eine typsichere Kommunikation zwischen den Schichten einsetzen zu können.

Codeworx.Rest.Client

Dieses, auch auf nuget.org publizierte Paket, kann in Kombination mit einem Contract Interface als Kommunikationsbibliothek verwendet werden.

  • RestClient registrieren
      var services = new ServiceCollection();
      services.AddRestClient()
                  .WithBaseUrl("http://localhost:6001");
    
      var serviceProvider = services.BuildServiceProvider();
    
  • Service aufrufen
      private async Task LoadData()
      {
          var client = serviceProvider.GetService<RestClient<ISampleController>>();
          var items = await client.CallAsync(p => p.GetItemsAsync());
      }
    

Kunde:

Open SourceOpen Source

Mitarbeiter:

Tags:

  • C#
  • asp.net Core
  • MVC
  • Rest
teilen:

"Learning never exhausts the mind."

Leonardo da Vinci

aktuelle News

nützliche Links