c# - puede - Tratar con enumeraciones cuando las interfaces están en proyecto separado
no se puede crear una instancia de una interfaz (3)
Deberá mover la definición de enumeración al proyecto Interfaces o a un proyecto separado al que hagan referencia ambos proyectos.
Personalmente los mantendría en el mismo proyecto, tener un proyecto separado solo para enumeraciones parece exagerado.
Tengo los siguientes proyectos en una solución de Visual Studio para una aplicación:
- Común - Métodos de utilidad y extensiones
- Entidades: objetos de dominio enriquecido con lógica empresarial específica para las instancias
- Repositorios - Repositorios de datos
- DataServices: Thin Wrapper to Repositories, contiene lógica de negocios no específica para una instancia
- Interfaces: todas las interfaces para entidades y repositorios
La razón por la que coloqué las interfaces en un proyecto separado es evitar referencias circulares de proyectos. Esto permite que dos proyectos hagan referencia a una interfaz común evitando tener tanto referencia del proyecto como la implementación concreta.
Intencionalmente no hice referencias de proyectos en el proyecto Interfaces para evitar referencias circulares de proyectos. Creo una interfaz para clases definidas en otros proyectos, esto me permite hacer referencia a la interfaz del objeto, en oposición a la implementación concreta en otras interfaces.
Entonces un ejemplo sería:
namespace Acme.Entities
{
public class Person : IPerson
{
string Name { get; set; }
}
}
namespace Acme.Interfaces
{
public interface IPerson
{
string Name { get; set; }
}
}
namespace Acme.Interfaces
{
public interface ITeam
{
string Name { get; set; }
IPerson Leader { get; set; }
}
}
El problema que me he encontrado es cuando una interfaz hace referencia a una enumeración definida en otro proyecto. Sin mover las entradas en el proyecto Interfaces, no estoy seguro de cómo hacer referencia a las entradas sin crear referencias de proyectos, por ejemplo:
namespace Acme.Entities
{
public enum Status
{
Unknown =0,
Active = 1,
Active = 2
}
}
namespace Acme.Interfaces
{
public interface IPerson
{
string Name { get; set; }
Acme.Entities.Status ActiveStatus { get; set; }
}
}
El Acme.Entities.Status fallará a menos que haga referencia al proyecto Acme.Entities, pero eso creará una referencia circular porque Acme.Entities hace referencia al proyecto Interfaces.
Diría que tus tipos básicos de datos (incluidas las enum
, las interface
y las class
) deberían estar todos en un solo proyecto. Por lo tanto, su proyecto de Interfaces
debe incluir esta enum
y cualquier otro tipo de datos que sean comunes (tal vez tipos de base abstract
). Entities
deben continuar teniendo elementos específicos de implementación que amplíen y / o usen los elementos básicos en Interfaces
. También podría tener sentido fusionar Interfaces
con su proyecto Common
, ya que la lógica común y los datos comunes a menudo van de la mano.
Si define sus componentes e interfaces de forma correcta, nunca tendrá este problema.
Le sugiero que primero revise su código y la arquitectura de su aplicación con estos dos principios:
http://en.wikipedia.org/wiki/Single_responsibility_principle http://en.wikipedia.org/wiki/Interface_segregation_principle
Domain Driven Desgin ---> Reglas muy impotentes: http://en.wikipedia.org/wiki/Domain-driven_design
También estoy de acuerdo con que tienes que mover los Enumedos COMPARTIDOS a un IConstants.cs común. Los enum no son más que constantes;