Ich nehme an, dies möglich ist, aber ich bin nicht sicher, Sie dies wünschen würde. Ich würde den folgenden Ansatz nehmen (ungetestet, nicht sicher, ob es funktioniert).Zunächst erstellen Sie die folgende Projektstruktur in Ihrer Lösung:
ServiceInterfaces
ServiceImplementations
(Referenzen ServiceInterfaces
und ModelClasses
)
ModelClasses
Host
(Referenzen ServiceInterfaces
und ServiceImplementations
)
Client
(Referenzen ServiceInterfaces
und ModelClasses
)
In ServiceInterfaces
Sie verfügen über eine Schnittstelle wie folgt aus (ich die Namensräume übersprungen, etc das Beispiel kürzer zu machen):
[ServiceContract]
public interface IMyService<T>
{
T GetObject(int id);
}
In ServiceImplementations
Sie haben eine Klasse, die implementiert IMyService<T>
:
public class MyService<T> : IMyService<T>
{
T GetObject(int id)
{
// Create something of type T and return it. Rather difficult
// since you only know the type at runtime.
}
}
In Host
haben Sie die richtige Konfiguration für Ihren Dienst in einer App.config
(oder Web.config
) Datei und den folgenden Code, um Ihren Dienst zu hosten (da es sich um eine eigenständige Anwendung handelt) :
ServiceHost host = new ServiceHost(typeof(MessageManager.MessageManagerService))
host.Open();
Und schließlich in Client
verwenden Sie eine ChannelFactory<TChannel>
Klasse einen Proxy zu definieren:
Binding binding = new BasicHttpBinding(); // For the example, could be another binding.
EndpointAddress address = new EndpointAddress("http://localhost:8000/......");
IMyService<string> myService =
ChannelFactory<IMyService<string>>.CreateChannel(binding, address);
string myObject = myService.GetObject(42);
Wieder bin ich nicht sicher, ob das funktioniert. Der Trick besteht darin, Ihre Serviceschnittstellen (in ServiceInterfaces
) und Domänenmodellobjekte (in ModelClasses
) zwischen dem Host und dem Client zu teilen. In meinem Beispiel verwende ich eine Zeichenfolge, um von der Service-Methode zurückzukehren, aber es könnte ein beliebiger Datenvertragstyp aus dem Projekt ModelClasses
sein.
Siehe auch http://StackOverflow.com/Questions/6223886/Generic-Service-Interface –