Kann ich C # dapper verwenden, um so etwas zu tun:
IFoo bar = _dbConnection.Query<IFoo>("My query there");
Jetzt kann ich es nicht tun, da der parameterlose Standardkonstruktor nicht implementiert ist.
Gibt es einen Trick, Götter von SOLID zu ehren (besonders Geister des Likov Substitutionsprinzips) oder sollte ich es so lassen wie es ist und meine Daten nicht auf IFoo, sondern auf Foo abbilden?
Ich mache mir wirklich Sorgen darüber, ob ich diese SOLID-Sachen respektiere, aber ich weiß immer noch nicht, wo ich es tun soll, also suche einen Rat für diese konkrete Situation.
Sie benötigen eine konkrete Implementierung Ihrer Klasse zur Instanziierung. Intern muss es ein neues Objekt erstellen. Sie können keine neue Instanz einer Schnittstelle erstellen:
var foo = new IFoo(); // This won't build!
Sie können Ihr Ergebnis immer noch auf eine Schnittstelle umwandeln, aber Sie benötigen einen konkreten Typ, um aus der Datenbank zu erstellen.
IEnumerable<IFoo> foo = _dbConnection.Query<Foo>("My query there");
Eine Möglichkeit zum Organisieren des Repositorys besteht darin, private Klassenobjekte für die Abfrage zu verwenden, aber die Ergebnisse als öffentliche Schnittstellen verfügbar zu machen.
Pulbisches Modell:
namespace MyProject.Foo.Model
{
public interface IFoo
{
string Property1 { get; set; }
string Property2 { get; set; }
}
public interface IFooRepository
{
IEnumerbale<IFoo> GetFoos();
}
}
Abfrageimplementierung mit privater Klasse:
namespace MyProject.Foo.Repositories
{
public class FooRepository: IFooRepository
{
private class Foo: IFoo
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}
public IEnumerbale<IFoo> GetFoos()
{
IEnumerable<IFoo> foo = _dbConnection.Query<Foo>("My query there");
return foo;
}
}
}