2009-10-28 20 views
8

Mi pregunta no es tanto sobre el uso de interfaces sino más sobre la naturaleza de la organización de un proyecto.¿Deberían las interfaces estar en un proyecto separado de su implementación?

Nota: Estoy usando VisualStudio en una aplicación de varias capas.

¿Deberían mis archivos de interfaz vivir en un proyecto separado de sus implementaciones? Mi idea inicial es que sería útil separar todas mis interfaces de servicio en su propio proyecto (y un proyecto para mis implementaciones iniciales) para que en el futuro la implementación/proyecto concreto pueda ser eliminado y reemplazado por uno nuevo si necesario.

Para aclarar con un ejemplo: Supongamos que tengo una interfaz de capa empresarial llamada IBusinessService que vive en el espacio de nombres MyApp.Business.Services. Mi implementación FooBusinessService existiría en el mismo espacio de nombres, pero un proyecto diferente en VisualStudio. Si posteriormente la implementación necesita ser rediseñada, un desarrollador podría eliminar la referencia a FooService.proj y reemplazarla con una referencia a BarService.proj.

Esto parece que eliminaría la solución de la aplicación al permitirle hacer referencia a un proyecto con solo interfaces sin adquirir también implementaciones concretas (que pueden ser obsoletas o inútiles para usted), pero ¿me falta algo?

+0

posible duplicado de [¿Debo tener un ensamblaje separado para las interfaces?] (Http://stackoverflow.com/questions/3363312/should-i-have-a-separate-samble-for-interfaces) – nawfal

Respuesta

10

Estoy contigo. Prefiero poner mis interfaces en un proyecto separado Y en un espacio de nombres diferente. El ejemplo clásico es con clases de acceso a datos. Desea poder codificar una versión MSSQL y una versión MySQL, ambas implementando la misma interfaz. Como tal, prefiero que la definición de la interfaz esté en un ensamblaje/proyecto por separado. Aquí está un ejemplo de cómo yo estaba a cabo asambleas y espacios de nombres:

  • Elder.DataAccess.Core - contiene las interfaces y utilidades comunes
  • Elder.DataAccess.MSSQL - MSSQL implementaciones específicas de las interfaces
  • Elder. DataAccess.MySQL: implementaciones MySQL específicas de las interfaces

Esto me permite modificar las implementaciones sin tocar el proyecto que contiene las definiciones de la interfaz. Esto me ayuda con el control de versiones y el seguimiento de cambios, también. Puede haber otras maneras de despellejar a este gato, así que estaré ansioso por ver las respuestas de otras personas.

+1

Gracias Scott. Esta es la estructura que estoy usando ahora, solo quería una confirmación de que tenía sentido y que no me faltaba algo. A menos que alguien más señale un defecto, lo usaré para mis interfaces. –

Cuestiones relacionadas