(Hoffe habe das Problem richtig verstanden ^^; bin schon etwas müde)
Mir ist zwar eine Lösung eingefallen, finde sie jedoch nicht sehr elegant um erlich zu sein.
-> Im Grunde machst du es genau wie bisher und fügst einfach alle 3 Service Anbieter deinem Consumer Projekt als Refferenzen hinzu (unter verschiedenen
Namespaces!).
-> Bevor du im Consumer-Projekt weitermachen kannst, stelle sicher das alle DataContract-Klassen partiel sind.
-> Im Consumer-Projekt erweiterst du jede der Data-Contract Klassen um eine Interface Implementierung, in einer partiellen Klasse, die dir jeglichen Zugriff auf die benötigten Properties gewährt.
Hier ein kleine Verdeutlichung:
Quelltext
1: 2: 3: 4: 5: 6:
| [DataContract] public partial class SomeEntity { [DataMember] public object SomeProperty { get; set; } } |
-- Die Data-Contract Klasse in allen Service Projekten
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| namespace ServiceOne { [ServiceContract] public class FirstService { [OperationContract] public SomeEntity GetFirstData() { return new SomeEntity() { SomeProperty = "ahoi" }; } } } namespace SecondService { [ServiceContract] public class SecondService { [OperationContract] public SomeEntity GetSecondData() { return new SomeEntity() { SomeProperty = "moin" }; } } } |
-- Zwei Services aus verschiedenen Projekten die mit gleicher Entität arbeiten
Nun zu dem Consumer-Projekt
Quelltext
1: 2: 3: 4:
| public interface ISomeEntity { object SomeProperty { get; set; } } |
-- Ein Interface, welches Zugriff auf die notwendigen Properties gewährt
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| namespace Consumer.ServiceReference1 { public partial class SomeEntity : ISomeEntity { } } namespace Consumer.ServiceReference2 { public partial class SomeEntity : ISomeEntity { } } |
-- Zwei partielle Klassen-Komponenten für jeden Service Namespace, der die Data-Contract Klasse um die Interface Angabe erweitert (Implementiert ist es ja sowieso)
Anwendung:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| namespace Consumer { public class Program { public static void Main() { ISomeEntity[] someEntities = new ISomeEntity[2]; var client1 = new FirstServiceClient(); someEntities[0] = client1.GetFirstData();
var client2 = new SecondServiceClient(); someEntities[1] = client2.GetSecondData();
foreach(var entity in someEntities) Console.WriteLine("some service says: {0}", entity.SomeProperty); Console.ReadKey(); } } } |
Es ist wirklich keine schöne Lösung, nur zu dieser späten Stunde fällt mir nichts besseres ein. Wenn du nach etwas kurzfristigen/schnellen suchst, versuch es so, wenn aber noch Zeit bleibt, warte lieber noch ein bisschen auf einen eleganteren Ansatz
mfg SakeSushi