Полагаю, это возможно, хотя я не уверен, что вы этого захотите. Я бы взял следующий подход (непроверенный, не уверен, работает ли он). Сначала создайте следующую структуру проекта в своем решении:
ServiceInterfaces
ServiceImplementations
(ссылки ServiceInterfaces
и ModelClasses
)
ModelClasses
Host
(ссылки ServiceInterfaces
и ServiceImplementations
)
Client
(ссылки ServiceInterfaces
и ModelClasses
)
В ServiceInterfaces
у вас есть такой интерфейс (я пропустил пространства имен и т. Д., Чтобы сделать пример короче):
[ServiceContract]
public interface IMyService<T>
{
T GetObject(int id);
}
В ServiceImplementations
у вас есть класс, который реализует 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.
}
}
В Host
у вас есть правильная конфигурация для вашей службы в файле App.config
(или Web.config
) и следующий код для размещения вашей службы (учитывая, что это отдельное приложение):
ServiceHost host = new ServiceHost(typeof(MessageManager.MessageManagerService))
host.Open();
И, наконец, в Client
вы используете класс ChannelFactory<TChannel>
для определения прокси:
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);
Опять же, я не уверен, работает ли это. Хитрость заключается в том, чтобы разделить ваши сервисные интерфейсы (в ServiceInterfaces
) и объекты модели домена (в ModelClasses
) между хостом и клиентом. В моем примере я использую строку для возврата из метода сервиса, но это может быть любой тип контракта данных из проекта ModelClasses
.