2010-11-30 9 views
1

Ich benutze ASP .NET MVC2, um eine datengesteuerte Website zu erstellen. Ein Teil der Featureanforderung besteht auch darin, wiederverwendbare Webdienste zu erstellen, um einige der Daten und Geschäftslogiken offenzulegen, mit denen Endbenutzer Mashups erstellen können. Es wird eine erhebliche Anzahl von Benutzern geben, die es innerhalb und außerhalb unserer Organisation verwenden.Webservices in ASP .NET MVC2

Bisher habe ich die Anwendung gebaut, die der Datenbank kommuniziert (Entity Framework ORM), Prozesse und zeigt die Daten (unter Verwendung der Modellansicht Ansicht Modellmuster). Dieser Teil ist für den Webseitenteil einfach gewesen.

Für den Teil Webdiensten, ich bin auf der Suche in WCF mit Hilfe des Web-Service zu erstellen. Soll ich WCF-Datendienste als separates Projekt erstellen? Ich vermute, ich sollte in der Lage sein, einen Teil des Codes im Controller wiederzuverwenden.

In der Website Teil soll ich nenne diesen Web-Service und sie als Modell verwenden? Irgendwelche Best Practices?

Als somoeone neue .net, alle Hinweise in der richtigen Richtung Asp würden sehr geschätzt werden.

+0

Gibt es einen besonderen Grund, warum Sie benötigen einen WCF-Dienst zu erstellen, und als Webservice nicht nur durch Rücksendung 'JsonResult' wie die Ansicht Ausgabe verwenden MVC? – KallDrexx

+0

@KallDrexx: Mangel an Flexibilität wäre ein Grund. –

+0

@KallDrexx, warum 'JsonResult' verwenden, wenn Sie direkt vom Controller aus auf den SQL-Server zugreifen können? Ich denke, hier besteht die Frage darin, einen wiederverwendbaren Dienst verfügbar zu machen, der von verschiedenen Clients genutzt werden könnte. –

Antwort

2

Sie könnten eine separate Web-Anwendung verwenden, um den Web-Hosting-Service. Dadurch erhalten Sie die Möglichkeit, Ihre MVC-Anwendung und den WCF-Dienst in separaten virtuellen Verzeichnissen in IIS zu hosten. Sobald Sie den Web-Service schrieben könnten Sie eine Client-Proxy und dann in der Client-Anwendung erzeugen Sie ein Repository verwenden:

public interface IProductsRepository 
{ 
    IEnumerable<Person> GetProducts(); 
} 

und dann eine spezifische Implementierung dieses Repository, das die Daten aus Ihrem WCF-Dienst wird holen:

public class ProductsRepositoryWcf 
{ 
    public IEnumerable<Person> GetProducts() 
    { 
     using (var client = new YourWebServiceClient()) 
     { 
      // call the web service method 
      return client.GetProducts(); 
     } 
    } 
} 

Und schließlich dieses Repository in den Konstruktor des Controllers injizieren, die wie folgt aussehen könnte:

public class HomeController: Controller 
{ 
    private readonly IProductsRepository _repository; 
    public HomeController(IProductsRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     var products = _repository.GetProducts(); 
     // TODO: An intermediary step might be necessary to convert the Product 
     // model coming from the web service to a view model which is adapted 
     // to the given view 
     return View(products); 
    } 
} 

wie Sie sehen können Jetzt ist der Controller vollständig entkoppelt, wie die Daten abgerufen werden. Es ist nur wichtig, dass es den gegebenen Vertrag respektiert (IProductsRepository-Schnittstelle). Mit Ihrem bevorzugten DI-Framework können Sie die Implementierung einfach wechseln.

Übrigens, wenn Ihr Code mir ähnelt, ist die einzige Sache, die Sie in Ihrer aktuellen MVC-Anwendung ändern sollten, die Modelle und Datenzugriffsschichten in ein separates WCF-Dienstprojekt zu externalisieren, dem Sie Servicereferenz hinzufügen würden, implementieren Sie die ProductsRepositoryWcf Repository und weisen Sie Ihr DI-Framework an, diese Implementierung anstelle der ProductsRepositorySql zu verwenden, die jetzt zum Webdienst gehen würde.

+0

Danke Danke. Wird eine separate Anwendung zum Hosten der WCF-Dienste einrichten. Frage - Ich hatte vor, mit einfachem asmx zu gehen, da es auf der db-Seite nur einfache Abfragen mit etwas Geschäftslogik oben gibt. Dann begann man sich WCF Datendienste anzusehen. Wäre es einfacher angesichts der Möglichkeit, einfach mit asmx zu gehen? Würde ProductsRepositoryWCF mir auch einen Performance-Hit geben (auf der Web-Anwendungsseite). Soll ich beides verwalten und weiterhin ProductsRepositorySQL für die Web App verwenden? Ich möchte es als eine Codebasis für Wartbarkeit behalten. Danke noch einmal. – user275157