2010-01-12 14 views
5

Tengo tres proyectos de C# en mi solución. Una es una aplicación de consola que simplemente llama a un proyecto de biblioteca de clase. El proyecto de biblioteca de clase hace todo el procesamiento para la aplicación. Luego hay un proyecto de WinForm que muestra un formulario y luego cuando se presiona un botón, invoca la misma lógica en el proyecto de la biblioteca de la clase. Como resultado, hay dos formas de ejecutar la lógica, a través de la consola o a través de una interfaz de usuario de Windows (WinForm).¿Cómo diseño lógica de vista en proyectos de C#

Mi problema es que, en parte de la lógica de la biblioteca de clases, si se está utilizando la aplicación UI, quiero que aparezca un formulario personalizado de WinForm para hacerle una pregunta al usuario.

En la aplicación de consola, quiero el mismo lugar en la lógica para simplemente escribir en la consola. En mi comprensión de la arquitectura, no desea que el proyecto de la biblioteca de la clase contenga la lógica de WinForm y requiera que tenga referencias a todas las referencias de WinForm. Pero, ¿cómo hago una llamada al proyecto de WinForms (u otra cosa) para mostrar el formulario personalizado de WinForm? Habría una referencia circular donde la biblioteca de la clase haría referencia a la aplicación principal de WinForm y la aplicación WinForm haría referencia al proyecto de la biblioteca de la clase.

¿Cuál es la forma estándar de hacer esto?

+1

pensaría en él como un evento de la biblioteca de clases e implementar un oyente dentro de su Código de UI (ya sea consola o Winforms). – Lazarus

Respuesta

2

Puede crear una interfaz que su biblioteca defina para comunicarse con la persona que llama, luego hacer que sus aplicaciones definan sus propias implementaciones de esta interfaz, la biblioteca llama a los métodos en esta interfaz y no sabe nada de la implementación.

La persona que llama procesa los métodos en consecuencia ...

public interface IProgressReporter 
{ 
     void ReportMessage(string message); 
} 



public class WinFormsProgressReporter : IProgressReporter 
{ 
    public void ReportMessage(string message) 
    { 
      MessageBox.SHow(message); 
    } 
} 

public class ConsoleAppProgressReporter : IProgressReporter 
{ 
    public void ReportMessage(string message) 
    { 
      Console.WriteLine(message); 
    } 
} 

public class LibraryClass 
{ 
    public static void SomeMethod(IProgressReporter rep) 
    { 
     rep.ReportMessage("Wooooohooooo!"); 
    } 
} 
0

Aquí es donde necesita una definición clara entre su capa lógica y su capa de interfaz de usuario. Es perfectamente aceptable y normal poner este tipo de lógica en su UI, ya que ese bit no puede vivir razonablemente dentro de la capa lógica, ya que depende de la interfaz de usuario.

2

¿Por qué no define una inteface, IOutputHandler, que tiene un método llamado DisplayOutput. Tendrás 2 implementaciones, una para tu aplicación de winforms y otra para la consola. Llamarías a la versión correcta en tiempo de ejecución. Puede modificar su biblioteca de clases para tener una instancia de campo privada para IOutputHandler, y luego conectar la correcta en el tiempo de ejecución.

+0

Verdadero - Debería consultar Inyección de dependencias y observar las diversas plataformas existentes, como StructureMap. – MunkiPhD

2

Puede generar un evento en la biblioteca de clase que se escucha/registra desde cualquier capa de UI/Consola. De esta forma, puede decidir actuar en caso de que se considere necesario en tantos lugares como desee. Realmente depende de cómo esté configurada su arquitectura.

+0

El controlador de eventos tendría que devolver la llamada a la biblioteca para establecer el resultado de la devolución y deberá esperar la respuesta antes de continuar, pero funcionaría – ChrisF

0

Su lógica debería nunca, nunca referirse a cualquier tipo de componente de interfaz de usuario. Si lo hace, está mal, y necesita rediseñarlo para eliminar las dependencias de UI por completo.

0

Si bien las respuestas de la interfaz son probablemente mejores soluciones, si solo es un método puede usar un delegado para pasar la consola o el método WinForm a la biblioteca de clases.

0

Otra solución

En su clase lib ..

public void MyLibMethod(Action<string> callBack) 
{ 
     callBack("Yeh baby..."); 
} 

A continuación, llame

Class.MyLibMethod(s=> Console.WriteLine(s)); 
Cuestiones relacionadas