2009-02-27 9 views
1

wenn Sie eine Einheit, die Referenz in dem Client und ein Webservice wie dieseWie können Sie Ihre Domain-Entitäten über einen .Net-Webservice nutzen?

public class Post 
{  
     public int ID {get; set;} 
     string Data {get; set;} 
} 



public class MyService: System.Web.Services.WebService 
{ 
     [WebMethod] 
     public int Write (Post post) 
     { 
       //Do stuff 

     } 
} 

auf dem Client, um die Einheit zu verwenden, die Sie von der Proxy-Klasse

public void ClientMethod() 
     { 
     var post = new proxyclass.Post(); 
     //fill post 
     new ProxyClass.Myservice().Write(post) 

     } 

wie kann instanziiert Ich benutze meine Domain-Entität, um den Webservice anzurufen.

public void ClientMethod() 
      { 
      var post = new Post(); 
      //fill post 
      new ProxyClass.Myservice().Write(post) 

      } 

Antwort

2

Grundsätzlich kann man nicht - mit normalen Web-Dienste, zumindest ... die Proxy-Klasse vollständig getrennt ist. Allerdings ist das obige möglich mit WCF, wo Sie eigentlich keine Proxy-Klassen überhaupt benötigen (für SOA Reinheit ist es jedoch eine gute Idee, sie zu verwenden).

Sie könnten Reflexion (usw.) verwenden, um die Eigenschaften zwischen Ihre Domäne Entitäten und die Proxys zu kopieren, aber es ist sehr schwer, diese zu 100% richtig zu machen (obwohl XML-Serialisierung [theoretisch] als Zwischensprache arbeiten sollten).


Also; wenn Sie die Baugruppenfreigabe verwenden möchten; Um halten, einen Dienst mit WCF betrachten, die diese ;-p

unterstützt eine Proxy-Schicht ohne zu verwenden, können Sie tun Tricks wie:

public class WcfClient<T> : ClientBase<T> where T : class 
{ 
    public T Service { get { return base.Channel; } } 
} 

(dies wird die Standardkonfiguration aus der App zugreifen. Config, für mehr Kontrolle müssen Sie ein paar Konstruktorüberladungen zu den Basis Konstruktorüberladungen)

Dann passend hinzuzufügen:

interface IFoo {void Bar();} 
... 
using(WcfClient<IFoo> client = new WcfClient<IFoo>()) { 
    client.Service.Bar(); 
} 
1

Sie WCF für die Entwicklung neuer, wann immer möglich verwenden sollten.

Sie sollten jedoch Ihre Gründe für die Verwendung Ihrer Domänenklasse auf dem Client erneut überdenken. Es verstößt gegen die Prinzipien von SOA, indem es dem Kunden einige Details der Implementierung des Dienstes zur Verfügung stellt. Warum sollte der Client etwas über Ihre Entitätsklassen wissen, abgesehen von den Daten, die sie enthalten?

Zum Beispiel können Ihre Entitätsklassen Methoden zum Speichern der Entität in der Datenbank enthalten. Warum benötigt Ihr Client Zugriff auf diese Methode?

Auch einer der Hauptanliegen von SOA ist die Interoperabilität mit verschiedenen Plattformen. Sobald Sie Ihren Kunden bitten, Ihr (.NET), verhindern Sie, dass ein Java- oder PHP-Client zur Nutzung Ihres Dienstes geschrieben wird.

Sie haben vielleicht gute Gründe, solche Einwände zu überwinden, aber ich empfehle, dass Sie darüber nachdenken und sicherstellen, dass Ihre Gründe gut genug sind.