Я застрял в вопросе в течение 2 недель.
Предположим, у нас есть дуплексная служба WCF и клиентское приложение, которое вызывает эту службу.
В приложении есть класс MyCallBackClass, состоящий из службы. Я хотел бы передать созданную службу в конструкторе клиентского приложения MyCallBackClass (потерять связь). Таким образом, это выглядело бы как служба с одним методом и обратный вызов с одним методом:
ДОГОВОР ДУПЛЕКСНОГО ОБСЛУЖИВАНИЯ:
[ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(ICallback))]
public interface IService{
[OperationContract(IsOneWay = true)]
void GetDataFromService();
}
ДУПЛЕКСНЫЙ ОБРАТНЫЙ ЗВОНОК:
public interface ICallback{
[OperationContract(IsOneWay = true)]
void ReceiveMessage(string message);
}
Внедрение ДУПЛЕКС СЕРВИСА
public class Service : IService{
//... here a reference to the Callback endpoint
void GetDataFromService(){
callBackEndPoint.ReceiveMessage("Service was called.");
}
}
МОЙ КЛАСС, РЕАЛИЗУЮЩИЙ ОБРАТНЫЙ ЗВОНОК:
public class MyCallBackClass : ICallback, Widnows.Form
{
IService service;
public MyCallBackClass (){
InstanceContext instanceContext = new InstanceContext(this);
this.service = new ServiceClient(instanceContext);
}
public ReceiveMessage(string message){
this.textBoxMessage.Text = message;
//here I want to stress that I would like my CallBack object to be a Form or WPF Form
//so that I can react on callbacks by modyfing the Controls like TextBox, ListBox directly
}
}
Теперь в приложении я вынужден создать экземпляр службы в конструкторе объекта, реализующего интерфейс обратного вызова, допустим, это форма или форма WPF (как показано ниже):
public void Main(string[] args){
MyCallBackClass myWindow = new MyCallBackClass();
myWindow.GetDataFromService();
}
Я хотел бы ПРОЙТИ СЕРВИС в конструкторе обработчика обратного вызова, как показано ниже:
public void Main(string[] args){
Iservice service = new ServiceClient();// but what about the InstanceContext that is the MyCallBackClass object...???
MyCallBackClass myWindow = new MyCallBackClass(service);
myWindow.GetDataFromService();
}
И, конечно же, конструктор класса MyCallBackClass изменится на это:
public class MyCallBackClass : ICallback, Widnows.Form
{
IService service;
public MyCallBackClass (IService _service){
InstanceContext instanceContext = new InstanceContext(this);
this.service = _service;
...
}
Так что я могу внедрить любой тип службы, реализующей интерфейс IService, в клиентский класс, а также легко протестировать клиентский класс, высмеяв службу. К сожалению, я сталкиваюсь с ПЕТЛЕЙ ЗАВИСИМОСТИ. InstanceContext зависит от MyCallBackClass, который зависит от IService, который зависит от InstanceContext ...
Не могли бы вы попытаться понять и направить меня в любом направлении, которое могло бы решить эту проблему?