2012-04-20 2 views
2

Программа, над которой я работаю, предоставляет как обратные вызовы, так и службы с использованием wcf. В основном, то, что делают службы, просто возвращает значение некоторых переменных. Что касается обратного вызова, они просто обновляют эти переменные.Наследование службы Wcf (продление службы)

Я хочу, чтобы иметь возможность показывать один класс, содержащий только службы и один класс, содержащий службы и обратные вызовы.

Например:

[ServiceContract] 
[ServiceBehavior(InstanceContextMode=InstanceContextMode::Single, ConcurrencyMode=ConcurrencyMode::Multiple)] 
public ServiceClass 
{ 
    [OperationContract] 
    public int getValue() 
    { 
    return mValue; 
    } 

    protected static int mValue; 

}; 

[ServiceContract] 
[ServiceBehavior(InstanceContextMode=InstanceContextMode::Single, ConcurrencyMode=ConcurrencyMode::Multiple)] 
public ServiceAndCallbackClass : ServiceClass 
{ 
    [OperationContract] 
    public bool subscribe() 
    { 
    // some subscribing stuff 
    } 

    public void MyCallback() 
    { 
    ++mValue; 

    // Notify every subscriber with the new value 
    } 

}; 

Если я хочу только те услуги, я могу использовать базовый класс. Однако, если я хочу подписаться на обратный вызов и использовать эту услугу, я могу использовать ServiceAndCallbackClass.

Возможно ли это?

ответ

1

Одно решение, которое я нашел:

Сделайте 2 интерфейса. Первый из них содержит только сервисы, а второй - наследует от первого и добавляет обратные вызовы.

Класс реализации будет реализовывать два интерфейса.

Пример:

[ServiceContract] 
[ServiceKnownType(typeof(ICallback))] 
public interface IService 
{ 
    [OperationContract] 
    int GetData(); 
} 

[ServiceContract] 
public interface ICallback : IService 
{ 
    [OperationContract] 
    public bool subscribe(); 
} 

[ServiceBehavior(InstanceContextMode=InstanceContextMode::Single, ConcurrencyMode=ConcurrencyMode::Multiple)] 
public ServiceClass : IService, ICallback 
{ 
    public int getValue() 
    { 
    return mValue; 
    } 

    public bool subscribe() 
    { 
    // some subscribing stuff 
    } 

    public void myCallback() 
    { 
    ++mValue; 

    // Notify every subscriber with the new value 
    }  

    protected static int; 
}; 

[ServiceBehavior(InstanceContextMode=InstanceContextMode::Single, ConcurrencyMode=ConcurrencyMode::Multiple)] 
public ServiceAndCallbackClass : ServiceClass 
{ 
    // Dummy implementation used to create second service 
}; 

Оттуда, мы можем создать 2 услуги. Один основан на классе реализации и основан на классе «Dummy». Каждая служба будет создана из другого интерфейса и, таким образом, подвергая различные методы.

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