Hoi,
Ik ben begonnen aan een 'kleine' upgrade aan een oud project wat al een tijdje stil ligt. Het gaat om een combinatie van .NET client applicatie en een ASMX webservice. De client applicatie praat met de webservice via een doodnormale Service Reference. De webservice praat op zijn beurt met een database.
Om een lang verhaal kort te maken kom ik meteen tot mijn vraag: is het mogelijk om te controleren welke namen de objecten / classes krijgen die de service reference aanmaakt? Zo heb ik een object 'TeamProxy' in mijn webservice die door een webmethod terug gegeven wordt, maar ik wil graag dat die vertaald wordt naar gewoon 'Team'.
Hier een screenshot dat het hopelijk duidelijk maakt:
https://dl.dropboxusercontent.com/u/14309718/proxy.png
Nu het lange verhaal, mocht dit niet genoeg zijn...
De webservice heeft een groot aantal methods die objecten rechtstreeks uit de database terug sturen. Zeg bijvoorbeeld een webmethod "GetTeams" die alle teams terug stuurt die bij een User behoren:
Tijdens het stil liggen van het project is de database grondig veranderd en ben ik overgestapt op entity framework. Het resultaat is dat de database objecten (bijvoorbeeld "Team") nu ineens navigational properties bevatten in de vorm van ICollection properties. Het Team object heeft nu bijvoorbeeld een 'Users' property van het type ICollection, allemaal door entity framework gegenereerd.
Misschien voelen jullie het probleem al: deze properties kunnen niet geserializeerd worden en de webservice kan dus geen List<Team> terugsturen.
Goed, ik moet dus voor elk database object ook een "proxy" object maken (ik weet niet of dat de goeie naam is...) die alle 'simple properties' heeft van het database object maar niet de navigational properties. Ik heb een T4 template gemaakt die deze proxy objecten aanmaakt. Voor het Team object is er nu dus ook een TeamProxy object met dezelfde properties als Team, behalve de navigational properties.
Nu kan ik dus een List<TeamProxy> doorsturen, waarbij ik eerst een lijstje met Teams ophaal, en die daarna converteer naar TeamProxy objecten.
Dit werkt allemaal prima, de webservice draait nu weer, maar nu heb ik een probleem in mijn client applicatie: alle objecten die de Service Reference aanmaakt heten nu anders! (TeamProxy ipv Team). Ik moet er niet aan denken dat ik door alle code moet gaan lopen en alles moet gaan aanpassen... Ik kan ook geen slimme manier verzinnen om dat met een search/replace ofzo te doen.
Vandaar mijn vraag: is het mogelijk om te controleren welke namen de objecten krijgen die de service reference aanmaakt? Kan ik ergens aangeven dat het 'TeamProxy' hernoemt moet worden naar 'Team' in de code die de service reference aanmaakt?
Bedankt!
Ik ben begonnen aan een 'kleine' upgrade aan een oud project wat al een tijdje stil ligt. Het gaat om een combinatie van .NET client applicatie en een ASMX webservice. De client applicatie praat met de webservice via een doodnormale Service Reference. De webservice praat op zijn beurt met een database.
Om een lang verhaal kort te maken kom ik meteen tot mijn vraag: is het mogelijk om te controleren welke namen de objecten / classes krijgen die de service reference aanmaakt? Zo heb ik een object 'TeamProxy' in mijn webservice die door een webmethod terug gegeven wordt, maar ik wil graag dat die vertaald wordt naar gewoon 'Team'.
Hier een screenshot dat het hopelijk duidelijk maakt:
https://dl.dropboxusercontent.com/u/14309718/proxy.png
Nu het lange verhaal, mocht dit niet genoeg zijn...
De webservice heeft een groot aantal methods die objecten rechtstreeks uit de database terug sturen. Zeg bijvoorbeeld een webmethod "GetTeams" die alle teams terug stuurt die bij een User behoren:
C#:
1
2
3
4
5
6
7
8
| [WebMethod] public List<Team> GetTeams(int userId) { using (var db = new DatabaseContext()) { return db.Teams.Where(t => t.UserId == userId).ToList(); } } |
Tijdens het stil liggen van het project is de database grondig veranderd en ben ik overgestapt op entity framework. Het resultaat is dat de database objecten (bijvoorbeeld "Team") nu ineens navigational properties bevatten in de vorm van ICollection properties. Het Team object heeft nu bijvoorbeeld een 'Users' property van het type ICollection, allemaal door entity framework gegenereerd.
Misschien voelen jullie het probleem al: deze properties kunnen niet geserializeerd worden en de webservice kan dus geen List<Team> terugsturen.
Goed, ik moet dus voor elk database object ook een "proxy" object maken (ik weet niet of dat de goeie naam is...) die alle 'simple properties' heeft van het database object maar niet de navigational properties. Ik heb een T4 template gemaakt die deze proxy objecten aanmaakt. Voor het Team object is er nu dus ook een TeamProxy object met dezelfde properties als Team, behalve de navigational properties.
Nu kan ik dus een List<TeamProxy> doorsturen, waarbij ik eerst een lijstje met Teams ophaal, en die daarna converteer naar TeamProxy objecten.
Dit werkt allemaal prima, de webservice draait nu weer, maar nu heb ik een probleem in mijn client applicatie: alle objecten die de Service Reference aanmaakt heten nu anders! (TeamProxy ipv Team). Ik moet er niet aan denken dat ik door alle code moet gaan lopen en alles moet gaan aanpassen... Ik kan ook geen slimme manier verzinnen om dat met een search/replace ofzo te doen.
Vandaar mijn vraag: is het mogelijk om te controleren welke namen de objecten krijgen die de service reference aanmaakt? Kan ik ergens aangeven dat het 'TeamProxy' hernoemt moet worden naar 'Team' in de code die de service reference aanmaakt?
Bedankt!