2017-03-02 2 views
1

ich für die Durchführung CRUD-Operationen auf einer Datenbank eine allgemeine Service und ich würde im Idealfall es als WCF-Dienst wie so zu belichten:Service als Eigenschaften in WCF-Dienst

[ServiceContract] 
public interface ICrudService<T> where T : class 
{ 
    [OperationContract] 
    T Add(T arg); 

    // Read ... 
    // Update ... 
    // Delete ... 
} 

Leider ist WCF nicht Generika unterstützen .

WCF Generic Class

WCF exposing generic type 'T'

So würde Ich mag einen WCF-Dienst machen, anstatt andere Dienste als Eigenschaften verfügbar macht. Gefällt mir:

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    FooService FooService { get; } 

    [OperationContract] 
    BarService BarService { get; } 
} 

public interface ICrudService<T> where T : class 
{ 
    T Add(T arg); 

    // Read ... 
    // Update ... 
    // Delete ... 
} 

public class FooService : ICrudService<Foo> 
{ 
} 

public class BarService : ICrudService<Bar> 
{ 
}  

Es wird mich nicht zulassen, die Dienste als Betriebsverträge zu verwenden. Gibt es eine andere Möglichkeit, dies zu erreichen?

+0

Hier würde ich ernsthaft den Wert der Verwendung eines Dienstes in Frage stellen. Warum können Sie Ihre DB-Anrufe nicht gerade in Bearbeitung erstellen? –

+0

Ich möchte, dass die Operationen von der Clientseite aus aufgerufen werden können. Ich habe eine Anforderung, eine UWP-App als Client zu verwenden. –

Antwort

0

das stimmt: WCF unterstützt leider keine Generika. Aber es gibt eine Möglichkeit, Dictionary<string, object> als Eingabe zu erstellen. Ich bin mir nicht sicher, ob du das willst, aber ich hatte das gleiche Problem und ich könnte es auf diese Weise lösen.

[Serializable] 
public class WebServiceInputGetDataParams : ISerializable 
{ 
    public Dictionary<string, object> Entries 
    { 
     get { return entries; } 
    } 


    private Dictionary<string, object> entries; 
    public WebServiceInputGetDataParams() 
    { 
     entries = new Dictionary<string, object>(); 
    } 
    protected WebServiceInputGetDataParams(SerializationInfo info, StreamingContext context) 
    { 
     entries = new Dictionary<string, object>(); 
     foreach (var entry in info) 
     { 
      entries.Add(entry.Name, entry.Value); 
     } 
    } 
    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     foreach (var entry in entries) 
     { 
      info.AddValue(entry.Key, entry.Value); 
     } 
    } 
} 

Es ist eine Eingabeklasse. Sie können eine Methode wie folgt erstellen:

public void TestMethod(WebServiceInputGetDataParams input) 
{ 
    //access the input through dictiobnary 
    input.Entries 
} 
+0

Kennen Sie die Konzepte von wcf? Möchten Sie den gesamten Code posten? es ist nur eine Eingabeklasse. Du solltest den Rest selbst schreiben. – David

+0

Entschuldigung, ich wusste nicht, dass die geschützte Methode eine Konstruktorüberladung –

+0

war, sind Sie absolut willkommen. es ist für uns alle passiert. nicht wahr? – David

Verwandte Themen