Hallo zusammen,
ich stehe gerade ein wenig auf dem Schlauch...
Ich starte gerade ein neues MVC-Projekt und möchte den Datenzugriff möglichst mit Interfaces entkoppeln. Dazu möchte möchte ich gerne ein generisches Repository als Basisklasse verwenden und davon meine spezifischen Repositories ableiten.
Ich habe dazu mal ein Minimalbeispiel erstellt.
Folgende Interfaces habe ich eingeführt:
public interface IEntityBase
{
int Id { get; set; }
}
public interface IRepositoryBase<T> where T : IEntityBase
{
T FindById(int id);
}
public interface IArtikel : IEntityBase
{
String Name { get; set; }
}
public interface IArtikelRepository : IRepositoryBase<IArtikel>
{
void DoSomething();
}
Daraus habe ich dann folgende Implementierungen erstellt:
public class EntityBase : IEntityBase
{
public int Id { get; set; }
}
public class RepositoryBase<T> : IRepositoryBase<T> where T : IEntityBase
{
public T FindById(int id)
{
// Irgendein Code:
return Activator.CreateInstance<T>();
}
}
public class Artikel : EntityBase, IArtikel
{
public String Name { get; set; }
}
public class ArtikelRepository : RepositoryBase<Artikel>, IArtikelRepository
{
public void DoSomething()
{
Console.WriteLine("...");
}
}
Bei dem ArtikelRepository möchte ich also das IArtikelRepository implementieren, wovon das RepositoryBase aber schon die Methode FindById implementiert.
Ich gebe bei FindById T zurück, was im ArtikelRepository vom Typen Artikel ist. Artikel besitzt das Interface IArtikel - genau das erwartet IArtikelRepository auch.
Ich bekomme bei diesem Konstrukt aber folgende Fehlermeldung:> Fehlermeldung:
"ArtikelRepository" implementiert den Schnittstellenmember "IRepositoryBase<IArtikel>.FindById(int)" nicht. "RepositoryBase<Artikel>.FindById(int)" hat nicht den entsprechenden Rückgabetyp "IArtikel" und kann "IRepositoryBase<IArtikel>.FindById(int)" daher nicht implementieren.
Mir ist schon klar, dass IArtikelRepository als Rückgabewert ein "IArtikel" erwartet, ich aber ein "Artikel" zurückgebe. Aber Artikel ist doch IArtikel?! Ich bin etwas verwirrt...
Kann mich jemand aufklären? 😃