2009-08-23 24 views
10

tengo la siguiente situación:referencias circulares en mi en Proyectos de

  1. Un proyecto MyCompany.MyProject.Domain que contiene mi modelo de dominio, y las clases parciales (como Contact).

  2. quiero 'extender' (por clase parcial, no método de extensión) Contact mi clase con una propiedad Slug que me dará una sencilla representación de texto de usar el URL de nombre y apellido.

  3. Tengo un método de extensión de cadena ToSlug() en mi proyecto UtilityMyCompany.MyProject.Utilities que hace exactamente lo que quiero en 2).

  4. El problema: Mi proyecto Utility ya se hace referencia a mi proyecto Domain lo que significa que no puedo conseguir el proyecto para ver DomainToSlug() método del proyecto Utility sin causar referencia circular.

no estoy interesado en la creación de otro proyecto para resolver esto, y realmente quieren mantener la lógica Slug compartido.

¿Cómo puedo solucionar esto?

+1

¿Es 'Slug' un nombre apropiado aquí? ¿Te importa expandir el razonamiento detrás de usar ese nombre? Qué significa eso? –

+0

La parte 'circular-reference-problem-c' en la URL de esta pregunta (http://stackoverflow.com/questions/1318123/circular-reference-problem-c) se llama babosa. Básicamente es el término técnico para la parte de designación (generalmente legible para humanos) en una URL que hace referencia a una entidad/punto final en una aplicación web. Se usa principalmente para SEO o para hacer que la URL se vea mejor. – Alex

+0

Ok ... bueno, en ese caso, ¿no debería 'Utility.ToSlug()' funcionar en algo como 'ISluggable'? –

Respuesta

13

Su proyecto Utility incluir su MyCompany.MyProject.Domain parece un poco de olor a código. Supongo que estas son utilidades que trabajan específicamente en objetos de dominio. Si ese es el caso, ¿por qué no incluye MyCompany.MyProject.Utilities dentro de su proyecto Domain (naturalmente, modificando el espacio de nombre en consecuencia)?

En cualquier caso, la forma normal de romper este tipo de dependencias es abstraer lo que un proyecto requiere en un conjunto de interfaces, y encapsularlas en un ensamblaje separado. Antes de hacerlo, asegúrese de que lo que está haciendo conceptualmente es lo correcto.

En su situación particular, sin embargo, considerar la introducción de una interfaz, es decir, INameHolder:.

public interface INameHolder 
{ 
    string FirstName { get; set; } 
    string LastName { get; set; } 
} 

Entonces Contact implementa INameHolder. INameHolder existe en otro ensamblaje, llamémoslo MyCompany.MyProject.Domain.Interfaces.

A continuación, el proyecto hace referencia a UtilitiesInterfaces (noDomain) y lo mismo ocurre Domain, pero Interfaces no hace referencia a nada - la referencia circular se rompe.

+0

Probablemente vaya con esto .... experimentando ahora mismo. – Alex

2

método ToSlug copia al proyecto de Dominio y ToSlug llamada del delegado de utilidad a este nuevo método

+0

'Llamada ToSlug de la utilidad del delegado a este nuevo método' - ¿aclarar? ¿Cómo? – Alex

+0

este fue también mi pensamiento inicial, pero supuse que el dominio no se compartía, por lo que no permitía cargar la biblioteca de extensión. Podría haber estado equivocado. –

2

Si no puede compartir el dominio (probablemente sea correcto) y debe consumir la lógica de una biblioteca compartida, entonces realmente debe introducir otro ensamblaje.

O podría cargar la lógica en el tiempo de ejecución en el dominio por reflejo en el dominio para acceder a la biblioteca dependiente. No es difícil solo rompe la comprobación de tiempo de compilación.

2

Si está seguro de mantener el código en la DLL de la utilidad (la respuesta de Eric me parece inteligente), entonces podría crear una interfaz en su proyecto de utilidad, pasar esa interfaz como parámetro de su método ToSlug y luego tener su objeto de dominio implementa la interfaz.

Cuestiones relacionadas