Ik ben mij sinds kort aan het verdiepen in WCF in combinatie met Silverlight als frontend. Deze combinatie is voor mij -in theorie- de oplossing voor het overgrote deel van mijn toepassingen: een service die allerlei berekeningen en simulaties uitvoert op een grote bak met data en een webclient waarmee ik berekeningen kan sturen en resultaten grafisch kan weergeven. Silverlight geeft me de responsiveness en interactie die ik bij ASP.NET niet heb, en de learning curve ervan is laag omdat de opbouw (voor mijn toepassingen) voor 90% dezelfde is als 'gewone' WPF applicaties. Tot nu toe ben ik zeer onder de indruk van de mogelijkheden en vooral ook het gemak waarmee zo'n constructie opgezet wordt.
In deze eerste kennismaking met WCF kom ik echter ook voor het eerst in aanraking met de problemen die bij serialisatie komen kijken; zaken waarbij ik tot voor kort nooit had stilgestaan (mede doordat ik vanuit de functionele hoek in de softwareontwikkeling gerold en dus geen 'gedegen' IT opleiding heb gehad).
Ik wil in mijn service de volgende interface gebruiken:
Ik heb een hele reeks klasses die IField implementeren. In de huidige definitie van de service kan ik deze niet zonder meer meegeven in mijn aanroep; van wat ik uit bronnen op internet heb begrepen is het probleem dat bij serialisatie de relatie tussen mijn contracten en IField niet wordt meegenomen. Laat ik voorop stellen dat ik niet snap waarom dit uberhaupt nodig is: in de definitie van de klassen aan zowel de service als de client kant staat gespecificeerd dat ze aan de IField interface voldoen...
Een oplossing is het toevoegen van een ServiceKnownType attribute aan mijn service voor elke klasse die IField implementeert, wat als gevolg heeft -als ik het goed heb begrepen- dat in de metadata wordt meegegeven dat bijvoorbeeld Obligatie IField implementeert. Afgezien van het feit dat ik vele tientallen van dit soort klasses heb, is dit een ernstige beperking: iedere keer wanneer ik een klasse toevoeg, moet ik de definitie van de service aanpassen. Dan kan ik net zo goed geen interfaces gebruiken.
Een andere oplossing die ik gevonden heb, is het gebruik van de NetDataContractFormatSerializer. Dit is een .NET-specifieke serializer (voor mijn situatie geen beperking), die allerhande relevante metadata wel meestuurt waardoor dit probleem zich niet meer voordoet. Deze is alleen weer niet in .NET subset van Silverlight (versie 3) opgenomen.
Het probleem is dat ik de mogelijke oplossingen en beperkingen van dit probleem op dit moment niet kan overzien, omdat ik het probleem niet echt begrijp - nu heb ik de klok horen luiden, maar de klepel weet ik nog niet te vinden. Is er iemand die meer licht kan schijnen op de ins en outs van dit probleem en mij wellicht in de goede richting kan duwen?
Alvast bedankt
In deze eerste kennismaking met WCF kom ik echter ook voor het eerst in aanraking met de problemen die bij serialisatie komen kijken; zaken waarbij ik tot voor kort nooit had stilgestaan (mede doordat ik vanuit de functionele hoek in de softwareontwikkeling gerold en dus geen 'gedegen' IT opleiding heb gehad).
Ik wil in mijn service de volgende interface gebruiken:
C#:
1
2
3
4
5
6
| [ServiceContract] public interface IService { [OperationContract] IReport GetReport(List<IField> Pivot); } |
Ik heb een hele reeks klasses die IField implementeren. In de huidige definitie van de service kan ik deze niet zonder meer meegeven in mijn aanroep; van wat ik uit bronnen op internet heb begrepen is het probleem dat bij serialisatie de relatie tussen mijn contracten en IField niet wordt meegenomen. Laat ik voorop stellen dat ik niet snap waarom dit uberhaupt nodig is: in de definitie van de klassen aan zowel de service als de client kant staat gespecificeerd dat ze aan de IField interface voldoen...
Een oplossing is het toevoegen van een ServiceKnownType attribute aan mijn service voor elke klasse die IField implementeert, wat als gevolg heeft -als ik het goed heb begrepen- dat in de metadata wordt meegegeven dat bijvoorbeeld Obligatie IField implementeert. Afgezien van het feit dat ik vele tientallen van dit soort klasses heb, is dit een ernstige beperking: iedere keer wanneer ik een klasse toevoeg, moet ik de definitie van de service aanpassen. Dan kan ik net zo goed geen interfaces gebruiken.
Een andere oplossing die ik gevonden heb, is het gebruik van de NetDataContractFormatSerializer. Dit is een .NET-specifieke serializer (voor mijn situatie geen beperking), die allerhande relevante metadata wel meestuurt waardoor dit probleem zich niet meer voordoet. Deze is alleen weer niet in .NET subset van Silverlight (versie 3) opgenomen.
Het probleem is dat ik de mogelijke oplossingen en beperkingen van dit probleem op dit moment niet kan overzien, omdat ik het probleem niet echt begrijp - nu heb ik de klok horen luiden, maar de klepel weet ik nog niet te vinden. Is er iemand die meer licht kan schijnen op de ins en outs van dit probleem en mij wellicht in de goede richting kan duwen?
Alvast bedankt
[ Voor 7% gewijzigd door Knakker op 09-04-2010 10:50 ]
Geef mij maar een Warsteiner.