metodos - llamar una clase en c#
¿Por qué las clases estáticas no implementan interfaces? (3)
Posible duplicado:
¿Por qué C no permite que los métodos estáticos implementen una interfaz?
En mi aplicación, quiero usar un Repositorio que haga el acceso de datos brutos (TestRepository, SqlRepository, FlatFileRepository, etc.). Debido a que dicho repositorio se usaría durante todo el tiempo de ejecución de mi aplicación, me pareció una cosa sensata convertirla en una clase estática, así que podría irme.
SqlRepository.GetTheThingById(5);
sin tener que ser regenerado todo el tiempo. Como quiero que mis repositorios sean intercambiables, les pido que implementen una interfaz común: IRepository. Pero cuando trato de hacerlo, obtengo
"Static classes cannot implement interfaces"
¿Por qué no pueden? ¿Cómo sugieres que cambie mi diseño? ¿Hay algún patrón que pueda usar?
ACTUALIZAR
Cinco años después: esta pregunta es visitada más de 20 veces, aprendí sobre las desventajas del patrón de repositorio, aprendí sobre IoC y me di cuenta de que mi pregunta estaba mal formulada.
Realmente no estaba preguntando qué es la especificación C # de una interfaz, sino por qué me estaba restringiendo deliberadamente de esta manera específica.
La respuesta práctica es que la sintaxis para llamar a un método en una instancia o en un tipo es diferente. Pero la pregunta está cerrada.
Las interfaces no pueden tener métodos estáticos. Una clase que implementa una interfaz necesita implementarlos todos como métodos de instancia. Las clases estáticas no pueden tener métodos de instancia. QED.
Por definición, las interfaces crean un contrato para que las instancias cumplan. Como no puede crear instancias de una clase estática, las clases estáticas no pueden implementar interfaces.
No es necesario tener un repositorio estático. Simplemente hazlo no estático e instancialo cuando lo necesites.
Tal vez nuestra experiencia ayudará. En lugar de SqlRepository como una clase estática, utilizamos AutoFac para inyección y ocultamos el contenedor detrás de una clase estática. Entonces cada entidad tiene una propiedad de repositorio estático:
public class Part : inheritence...
{
public static IPartRepository Repository
{
get { return IoCContainer.GetInstance<IRepository<Part>>(); }
}
// ... more part-y stuff
}
De esta forma, podemos cambiar la implementación y los llamantes siempre sabrán dónde obtenerla:
Part p = Part.Repository.Get(id);
En otro proyecto, hay un PartRepository registrado en el contenedor:
public class PartRepository : IPartRepository
{
// IPartRepository implementation that talks to injected DAL
}
En otro proyecto más, tenemos simulaciones para pruebas, incluidos repositorios precargados con entires conocidos:
public class MockPartRepository : Dictionary<Part, int>, IPartRepository
{
// IPartRepository implementation based on dictionary
}
... y está registrado en el contenedor para pruebas unitarias. La MISMA llamada obtiene el repositorio:
Part p = Part.Repository.Get(id);