2012-01-23 5 views
0

У меня есть интерфейс и несколько классов, использующих этот интерфейс, также на сервере есть фабрика, которая создает конкретный экземпляр на основе некоторых параметров.Переключение нескольких классов на WCF

Теперь я должен был бы разоблачить эти классы для клиентов WCF, я надеялся, что смогу отметить интерфейс как OperationContract и установить связь, но кажется, что на сервере (я новичок в WCF) Я должен создать сервис (или хотя бы открыть порт) для каждого класса, и я не могу сделать это для интерфейса.

Это единственный способ это сделать или я что-то упускаю?

Редактировать, чтобы прояснить:
Скажем, у меня есть интерфейс с одним методом, назовем его Execute(EnumedParam action). Я хотел бы быть в состоянии назвать его от клиента с

InterfaceType.Execute(Action.One); 

и на сервере, чтобы создать экземпляр, основанный на действии и выполнить это Execute метод.

Также может быть много экземпляров класса, и я бы хотел, чтобы клиент ничего не знал о классах, просто интерфейс.

Как это сделать через WCF?

(примечание: Если мой класс модели совершенно неправильно, вы можете порекомендовать книгу или блог, где я могу прочитать больше об этом?)

Я не могу вставить код в комментарии для другого редактирования

Wouter de Kort дал отличный пример того, что я делаю. Но как мне настроить конечные точки для этого? Глядя на приведенном здесь примере http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication - автор открывает порт, как это:

using (ServiceHost host = new ServiceHost(
    typeof(StringReverser), 
    new Uri[]{ 
    new Uri("http://localhost:8000"), 
    new Uri("net.pipe://localhost") 
    })) 
{ 

Теперь, где моя проблема. Первый параметр - это класс (не может быть интерфейсом или абстрактным классом). Должен ли я делать это для каждого класса, который расширяет интерфейс, или я могу каким-то образом использовать один и тот же хост для нескольких классов?

ответ

2

Допустим, у вас есть следующий интерфейс сервиса:

public interface IMyService 
{ 
    void Execute(EnumdParam action); 
} 

Если вы хотите использовать это в WCF вы украсите его:

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    void Execute(EnumdParam action); 
} 

На вашем клиенте вы должны создать прокси-сервер для доступ к службе WCF.

[System.Diagnostics.DebuggerStepThroughAttribute()] 
public partial class MyServiceClient : ClientBase<IMyService>, IMyService 
{ 
    public MyServiceClient() 
    { 
    } 

    public void Execute(EnumdParam action); 
    { 
     return base.Channel.Execute(action); 
    } 
} 

Как вы можете видеть, ваш клиент прокси реализует IMyService так в коде клиента вы должны только быть в курсе интерфейса IMyService. Если вы меняете завод, чтобы вернуть MyServiceClient вместо MyService, ничто в коде клиента не должно меняться (за исключением конфигурации WCF и убедитесь, что вы распоряжаетесь клиентом).

+0

Спасибо за ответ, я обновил сообщение в качестве ответа для вас. – user1164630

+0

@ user1164630 Настройка хоста для ваших служб WCF - еще одна проблема. В вашем примере консольное приложение используется для размещения служб WCF.Вы также можете использовать IIS и поместить конфигурацию в свой файл web.config –

Смежные вопросы