Frage

Ich arbeite mit Reporting Services und Sharepoint, Ich habe eine Anwendung, die Reporting Services nutzt jedoch ein Kunde unsere Anwendung in Sharepoint integriert möchten. Zur Zeit sind wir fest an der ReportService.asmx webservice gekoppelt, die für das Ausführen von Operationen verschiedene Verfahren aussetzt. Reporting Service hat etwas namens „Sharepoint Integration Modus“, wenn der Berichtsserver aktiviert funktioniert anders und Sharepoint verwendet wird, um die Berichte zu verwalten. Sharepoint fügt einen neuen Web-Service namens ReportService2006.asmx, die fast genau das gleiche.

Jetzt ist unsere Anwendung verwendet einen Web-Verweis auf den Report und verschiedene Objekte verwendet, die durch den Dienst ausgesetzt. ReportService2006 hat genau die gleichen Objekte, aber sie sind offensichtlich in einem anderen Namespace beispiel I 2 Webreferenzen hat -. 1 zu jedem Dienst, so gibt es ein Objekt MyApplication.ReportService.CatalogItem und anderen MyApplication.ReportService2006.CatalogItem ist

Ich habe versucht, Dependency Injection zu verwenden, um den Dienst aus unserer Anwendung mit einer Fabrik Mustern gekoppelt ABSRACT die Umsetzung meiner Schnittstelle zu bestimmen, zu instanziiert. Heres meine Schnittstelle. Ich habe es vereinfacht die Anrufe nur enthalten ich für diese Anwendung benötigen.

using System;
using NetworkUserEncrypt.ReportService;

namespace MyApplication.Service
{
    public interface IReportingService
    {
        CatalogItem CreateDataSource(string DataSource, string Parent, bool Overwrite, DataSourceDefinition Definition, Property[] Properties);

        void DeleteItem(string Item);

        DataSourceDefinition GetDataSourceContents(string DataSource);

        byte[] GetReportDefinition(string Report);

        CatalogItem[] ListChildren(string Item);
    }
}

Also ich habe zwei Implementierungen von dieser jeweils einen anderen Web-Service beispiels Instanziierung:

namespace MyApp.Service.Implementation
{
    class ReportingServiceImpl : IReportingService
    {
        ReportingService _service = null;

        public ReportingServiceImpl()
        {
            ReportingService _service = new ReportingService();
        }

        /* SNIP */
    }
  }

und

namespace MyApp.Service.Implementation
{
    class ReportingService2006Impl : IReportingService
    {
        ReportingService2006 _service = null;

        public ReportingService2006Impl()
        {
            ReportingService2006 _service = new ReportingService2006();
        }

        /* SNIP */
    }
  }

So der Plan ist, kann ich diese in meine ServiceWrapper zur Laufzeit injizieren. Allerdings - wenn Sie die Schnittstelle auffallen wird, ist mit dem Report gebunden und einige der Methoden geben Objekte, die von der Web-Referenz sind z.B. CatalogItem. So mein Projekt nicht bauen, weil meine Implementierung für ReportService2006 ist die CatalogItem aus einem anderen Namespace verweist.

Irgendwelche Ideen? Bin ich völlig in die falsche Richtung gehen mit diesem?

War es hilfreich?

Lösung

Die robusteste Lösung ist eine CatalogItem Schnittstelle zu erstellen und Wrapper für jede Ihres Web-Service erstellen und das Ganze hinter einer Fabrik verstecken. Die Fabrik wird die Logik enthält, die für den „richtigen“ Web-Service-Aufruf und den Client-Code muss geändert werden, um die Schnittstelle zu verwenden, aber es ist eine Veränderung zum Besseren.

WCF hat die meisten diese Probleme mit Servicevertrag lösen und wenn meine früheren Vorschläge zu unhandlich erweisen könnte man bedenkt, in Richtung auf eine WCF-Lösung migrieren.

Andere Tipps

Ich glaube, Sie in die richtige Richtung für diese Situation zusteuern, es wird nur eine angemessene Menge mehr von der Arbeit nehmen sie nach Hause zu fahren. Ich würde einige Proxy-Klassen erstellen, die beide Versionen der Klassen wickeln kann die Reflexion oder dynamischen Methoden. Ich habe auch Leute die Proxy-Klassen aus dem Remotenamespace zur Laufzeit und leiten sie Methodenaufrufe an die richtige Stelle abzufangen verwenden gesehen, dass die Art und Weise Sie die dynamischen Methoden auf Anfrage Codierung sie statt Hand schaffen könnte, alles, was Sie wirklich dafür brauchen ist eine Schnittstelle, die Schnittstelle des Objekts entspricht.

Fügen Sie entweder die Referenz es Wrapper für CatalogItem und den Rest der spezifischen Klassen benötigt oder bauen. Ich würde die Wrapper bauen, sollte die Schnittstelle in der Lage sein, auf eigenen Beinen stehen, ohne eine spezielle Implementierung zu verweisen.

Wenn die Web Services in unterschiedlichen Namensräumen befinden, dann gibt es keine triviale Lösung (z. B. etwas so einfach wie das Ändern der URL). Sie scheinen zwar auf dem richtigen Weg mit der Abstraktion zu sein.

obwohl

Wenn Sie etwas Zeit mitbringen, können Sie die generierten Web-Service-Klassen selbst (das „reference.cs“ -Dateien) ändern, und dann manuell zu Ihrem Projekt hinzufügen. Zuerst eine gemeinsame Schnittstelle erstellen, ändern Sie dann die ersten Zeilen in der Datei wie so:

public partial class MyWebService : SoapHttpClientProtocol, IMyWebService

Dann nutzen Sie diese um den Code zu nennen:

IMyWebService webService = new MyWebService();  // Or you can use a Factory

In VS2008, wenn ich versuche, ein Servicereference zu einem Webservice hinzufügen, ich sehe eine erweiterte Taste. Wenn Sie darauf klicken, gibt es eine Option „Wiederverwendungsarten“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top