DI Service Versionierung - Meinung/Vorschläge zur Implementierung

  • C#
  • .NET 5–6

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von slice.

    DI Service Versionierung - Meinung/Vorschläge zur Implementierung

    Ahoi zusammen,
    ich würde gerne mal eure Meinung zu folgendem Thema haben.

    Ich schreibe gerade eine Anwendung, die mit verschiedenen REST-APIs spricht.
    Problem ist, das einige der APIs mit Updates immer wieder Breaking-Changes mitbringen und da ich gerne mehrere Versionen pro API unterstützen möchte, ist nun die Frage wie ich das am besten Implementiere.

    Um das Problem zu visualisieren:

    Quellcode

    1. DataSourceA
    2. v1.0
    3. - GetUser()
    4. - GetGroup(...)
    5. - ...
    6. v2
    7. - GetUser(...)
    8. - GetGroup(...)
    9. - ...
    10. v3
    11. - GetCurrentUser()
    12. - GetGroup()

    Das ist jetzt nur eine sehr extreme und vereinfachte Darstellung der Situation, aber ich hoffe es verdeutlicht das Problem.
    Mit v2 erwartet die Methode GetUser Parameter und in v3 wurde die Methode zu GetCurrentUser umbenannt.

    Mir fallen derzeit zwei Varianten ein, wie ich das implementieren könnte, würde aber gerne eure Meinung dazu hören und eventuell hat einer eine bessere Idee?

    Implementation 1

    C#-Quellcode

    1. namespace Foobar.Services
    2. {
    3. internal class DataSourceAService
    4. {
    5. private readonly IDataSourceAVersion service;
    6. public DataSourceAService(string version)
    7. {
    8. switch (version)
    9. {
    10. case "v1":
    11. this.service = new DataSourceAV1();
    12. break;
    13. case "v2":
    14. this.service = new DataSourceAV2();
    15. break;
    16. default:
    17. throw new NotImplementedException();
    18. }
    19. }
    20. public void Exec()
    21. {
    22. this.service.Exec();
    23. }
    24. private interface IDataSourceAVersion
    25. {
    26. void Exec();
    27. }
    28. private class DataSourceAV1 :IDataSourceAVersion
    29. {
    30. public void Exec()
    31. {
    32. throw new NotImplementedException();
    33. }
    34. }
    35. private class DataSourceAV2 :IDataSourceAVersion
    36. {
    37. public void Exec()
    38. {
    39. throw new NotImplementedException();
    40. }
    41. }
    42. }
    43. }


    Implementation 2

    C#-Quellcode

    1. namespace Foobar.Services
    2. {
    3. interface IDataSourceBService
    4. {
    5. void Exec();
    6. }
    7. internal class DataSourceBServiceV1 :IDataSourceBService
    8. {
    9. public void Exec()
    10. {
    11. throw new NotImplementedException();
    12. }
    13. }
    14. internal class DataSourceBServiceV2 :IDataSourceBService
    15. {
    16. public void Exec()
    17. {
    18. throw new NotImplementedException();
    19. }
    20. }
    21. }


    PS: Ich tendiere zu Implementation 2, um dann mit dem Factory method pattern die richtige Version zu bekommen - dürfte fürs Testen auch einfacher sein.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „slice“ ()