views:

37

answers:

3

I have a webservice with a function that returns a type (foo). If I consume this webservice in .NET through the 2.0 generated proxies, it creates a class called foo in the generated proxy. If I have the DLL that contains that class (foo) that is the DLL being used by the webservice, is there any way to have it use that class instead of creating a custom proxy class? I'm looking for something similar to what remoting does... but not remoting.

A: 

I think the key issue here is in generating the proxies. I've generally used two different approaches to web services:

1) Traditional services, where you expose methods and a client generates the proxy in Visual Studio to consume the methods.
2) Request/Response services, where the exposed "service" is more of a pass-through and the "actions" being performed are encapsulated in the objects being sent to and received from the service. These actions would be in that shared library that both the server and the client have.

In the former I often run into this same problem and I don't really think there's a solution, at least not one that Visual Studio is going to like at all. You could perhaps manually modify the generated proxies to use the other classes, but then you'll have to repeat that step any time you re-generate. Conversely, you can generate outside of Visual Studio in something like CodeSmith (the older version is free, but depends on .NET 1.1), which will require some work to create a template for the proxies and to step outside the IDE to re-generate any time you need to update them.

I can recommend a good tool for the latter, however, and that would be the Agatha project. It takes the approach of separating the "service" from the "actions" that are being performed, and makes the approach of the shared library very easy. Such a re-architecture may very well be out of the question for the project you're working on depending on your schedule, but it's definitely something to explore for future projects.

David
That Agatha project is an interesting read, but I've had to deal with using RequestData and ResponseData classes in that general way before (although not through a webservice, where it makes more sense) and I must say I'm not a fan of that model.
Kyle W
A: 

You could write your own proxy class, or you could implement a constructor on your Foo class that takes an instance of the generated Foo class and copies over the data as appropriate.

Jim Lamb
That seems to be what it comes down to, although I wouldn't want to add any constructors to the base DLL. Unfortunately using this method would mean I would have to create a new set of conversion functions for every project that called that webservice.
Kyle W
If you don't want to add new constructors, you could use the default constructor and implement an extension method that copies the data from the proxy's class to your domain object.
Jim Lamb
A: 

I've seen 3 ways of doing this:

  1. Let Visual Studio generate the proxy and then change the classes in the proxy to the full class names of the dll, by hand. Works, but you would have to do this again everytime you update your proxy. Plus it's really dirty, isn't it?
  2. Use a generic class/method that creates deep copies of your proxy objects into the "real" objects by reflection. Works, but of course with a little performance offtrade
  3. Use WCF, where you can reference the dll with the data contracts (your data classes) and use them instead of creating any proxy by code generation.
Hinek