Estoy construyendo mi modelo de dominio y continuando con la refactorización. Mientras lo hago, descubro que me gustan las interfaces, ya que me permite crear métodos/controladores/vistas reutilizables para tipos concretos basados en sus interfaces. Sin embargo, estoy descubriendo que estoy creando una interfaz cada vez que agrego una nueva propiedad a una de mis entidades de dominio.Me preocupa que agregue demasiadas interfaces
Por ejemplo, tengo una objeto MemberStatus que hereda de un resumen Entidad objeto que a su vez implementa la interfaz IIdentifiableEntity lo que significa que tiene una propiedad Id. MemberStatus también implementa la interfaz INamedEntity que significa que tiene un nombre de propiedad, la IOrderedEntity interfaz que significa que tiene una propiedad DisplayOrder y los IHasMembers interfaz que significa que tiene una colección de objetos miembros. Aquí está el código:
public class MemberStatus : Entity, INamedEntity, IOrderedEntity, IHasMembers
{
public string Name { get; set; }
public float DisplayOrder { get; set; }
public ICollection<Member> Members { get; set; }
}
public abstract class Entity : IIdentifiableEntity
{
public int Id { get; set; }
}
public interface IIdentifiableEntity
{
int Id { get; set; }
}
public interface INamedEntity
{
string Name { get; set; }
}
public interface IOrderedEntity
{
float DisplayOrder { get; set; }
}
public interface IHasMembers
{
ICollection<Member> Members { get; set; }
}
Ahora, esto parece funcionar bien ya que otros objetos similares, tales como MemberPosition y MemberTeam la que todos implementan estas mismas interfaces y puedo usar mis métodos de depósito y acciones del controlador con los genéricos que implementan estas interfaces y tienen mucha reutilización de código.
Sin embargo, mi preocupación es si es apropiado o no seguir agregando interfaces simples de una sola propiedad cada vez que agregue una propiedad nueva a mis objetos concretos. Por ejemplo, supongamos que deseo agregar una propiedad bool Enabled
... ¿Debería continuar creando una interfaz IEnabled? La razón por la que estoy preguntando es que algunos de los "inicializadores" de controladores que usan genéricos son cada vez más largos, como se muestra en la siguiente línea de código. ¿Es esto normal y la mejor práctica?
public abstract class OrderedCrudController<TEntity> : CrudController<TEntity> where TEntity : Entity, INamedEntity, IOrderedEntity, IHasMembers, new()
Gracias Colin. Pregunta rápida ... ¿sería más apropiado para mí crear una clase abstracta llamada algo así como ** MemberPropertyEntity ** (que implementa las mismas interfaces que muestro arriba para MemberStatus) que luego heredarán MemberStatus, MemberPosition, MemberTeam (y por lo tanto, casi no tendría código en ellos directamente)? Mi inicializador de controlador solo necesitaría tener una cláusula 'donde TEntity: MemberPropertyEntity '. ¿Es esto mejor que tener controladores con un montón de requisitos de interfaz? – bigmac
@bmccleary Seguro: es un patrón relativamente común tener interfaces que son comunes a todas las entidades, como IHavePrimaryKey, pero implementan esta interfaz en una clase base abstracta. Sin embargo, mi punto original sigue en relación con interfaces como IEnabled, si nunca se refiere a tipos solo por esa interfaz, es de poca utilidad. – ColinE
Gracias Colin, ¡lo aprecio! – bigmac