Expondo internals de uma aplicação winforms através do WCF
Estou tentando dar os primeiros passos no IPC e no WCF, e até agora estou caindo de cara no chão. Eu tenho um aplicativo WinForms que gostaria de instrumentar um pouco para chamadores remotos. O aplicativo winforms tem a maior parte de sua lógica de negócios confinada a um singleton que cuida de todo o trabalho em segundo plano. Eu gostaria de expor algumas das funcionalidades através de um mecanismo de IPC. O WCF parece ser o caminho a seguir, então eu comecei com isso.
O que eu tentei é adicionar um projeto de biblioteca de serviços WCF à minha solução, através do qual eu gostaria de expor algumas chamadas. Quando inicio o projeto Winforms no depurador VS, ele é executado normalmente e o WcfSvcHost é inicializado. Eu posso me comunicar com o serviço WCF com o WcfTestClient.
No entanto, quando tento acessar o singleton segurando o código com o qual gostaria de me comunicar, parece que estou obtendo um novo objeto singleton. Claramente, estou fazendo errado; O que eu acho que está acontecendo é que o serviço é executado em um processo diferente, portanto, não há nenhum código compartilhado real e, portanto, nenhum singleton compartilhado.
Não tenho certeza de como devo continuar. A minha escolha de usar o WCF para IPC é a errada? Devo integrar os pontos de extremidade do WCF no aplicativo WinForms? O que estou tentando é viável?
EDIT: Eu percebi que isso era tão alto nível, e tão simples que qualquer amostra de código seria inútil. Eu acho que estava errado. Então, algum código:
No assembly WinForms:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
label1.Text = MySingleton.Instance.InitedAt.ToString();
}
}
public class MySingleton
{
private static MySingleton instance = new MySingleton();
private DateTime inited;
private MySingleton()
{
this.inited = DateTime.Now;
}
public static MySingleton Instance
{
get
{
return instance;
}
}
public DateTime InitedAt
{
get
{
return this.inited;
}
}
}
No assembly WCFServiceLibrary:
[ServiceContract]
public interface IApplicationProbe {
[OperationContract]
string DoesItWork();
[OperationContract]
string SingletonInited();
}
public class ApplicationProbe : IApplicationProbe {
public string DoesItWork(){
return "Why yes, yes it does";
}
public string SingletonInited(){
return MySingleton.Instance.InitedAt.ToString();
}
}
quando eu consultarSingletonInited
através do WcfTestClient, recebo um InitedAt que não é o mesmo DateTime que a instatiação do singleton do winforms.
Edit2:
Eu tenho esse código em execução como está (com o andaime gerado automaticamente em torno do material Winforms). O rótulo no formulário exibe um horário diferente do tempo retornado da chamada do WCF, demonstrando que é uma instância diferente.