Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

ASMX .NET webservice reference - naam van gegenereerd object

Pagina: 1
Acties:

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
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:
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!

Mijn iRacing profiel


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Kun je niet gewoon een WebServiceBinding attribute aan die class hangen en de Name property gebruiken?

C#:
1
2
3
4
[WebServiceBinding(Name="Team"]
public class TeamProxy  {
//...
}

[ Voor 16% gewijzigd door RobIII op 21-03-2014 22:53 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
RobIII schreef op vrijdag 21 maart 2014 @ 22:52:
Kun je niet gewoon een WebServiceBinding attribute aan die class hangen en de Name property gebruiken?

C#:
1
2
3
4
[WebServiceBinding(Name="Team"]
public class TeamProxy  {
//...
}
Hmm, dat klinkt veel belovend (had er nog niet bij stilgestaan dat het misschien aan de service kant kan), maar het lijkt niet te werken. Er veranderd niks aan de service en het heet nog steeds TeamProxy.

Mijn iRacing profiel


  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
Ik heb het opgelost door de service om te bouwen naar een WCF service en het DataContract attribuut te gebruiken op de classes (die heeft ook een Name property, en die werkt wel).

Toch bedankt! :)

Mijn iRacing profiel