Hallo,
ich habe eine Designfrage zum Thema Generic Collections und Interfaces. In dem angehängten Code ist ein vereinfachtes Beispiel. Die Frage ist, soll man IResultCollection implicit oder explicit implementieren, oder ist das eine freie Entscheidung ?
Der Hintergrund ist nämlich folgender:
Ich habe in meiner Solution folgende Projeke:
MyProject.Contracts
MyProjects.Rest
MyProjects.SQL
MyProjects.WebSite
Die WebSite beziehte ursprünglich seine Daten zum Präsentieren über Rest. Die angebotene Rest Schnittstelle bietet nicht sehr viele Möglichkeiten. Das Zusammensuchen der Daten dauert zum Teil bis zu 5 Sekunden. Zu Lange.
Deshalb wurde dasselbe auch über SQL realisiert. Dort kann das gesamte Ergebnis in weniger als 100 ms gesucht und präsentiert werden. Deshalb soll der Weg über SQL unsere bevorzugter Weg zum Präsentieren der Daten werden
Die jeweiligen Methoden zum beschaffen der Daten als auch die Ergebnisklassen, sind für SQL als auch für Rest vollkommen unterschiedlich. Sie haben ihre Gemeinsamkeit in den Interfaces. Die Interfaces finden Anwendung im WebSite Projekt.
Das Rest Projekt kann nicht abgeschafft werden, denn für die schreibenden Aktionen wollen wir die offiziellen Schnittstellen weiterhin benutzen.
Nehmen wir die implizite Implementierung des Interfaces, würden wir einen Rework in den Methoden benötigen, denn innerhalb dieser wurde mit den Klassen gearbeitet.
Die explizite Implementierung würde einen Cast erfordern. Die Ergebnisklassen können bis zu 10000 Elemente lang sein
Daher die grundsätzliche Frage; Welcher Weg ist zu bevorzugen und wieso?
Beispiel Code:
ich habe eine Designfrage zum Thema Generic Collections und Interfaces. In dem angehängten Code ist ein vereinfachtes Beispiel. Die Frage ist, soll man IResultCollection implicit oder explicit implementieren, oder ist das eine freie Entscheidung ?
Der Hintergrund ist nämlich folgender:
Ich habe in meiner Solution folgende Projeke:
MyProject.Contracts
MyProjects.Rest
MyProjects.SQL
MyProjects.WebSite
Die WebSite beziehte ursprünglich seine Daten zum Präsentieren über Rest. Die angebotene Rest Schnittstelle bietet nicht sehr viele Möglichkeiten. Das Zusammensuchen der Daten dauert zum Teil bis zu 5 Sekunden. Zu Lange.
Deshalb wurde dasselbe auch über SQL realisiert. Dort kann das gesamte Ergebnis in weniger als 100 ms gesucht und präsentiert werden. Deshalb soll der Weg über SQL unsere bevorzugter Weg zum Präsentieren der Daten werden
Die jeweiligen Methoden zum beschaffen der Daten als auch die Ergebnisklassen, sind für SQL als auch für Rest vollkommen unterschiedlich. Sie haben ihre Gemeinsamkeit in den Interfaces. Die Interfaces finden Anwendung im WebSite Projekt.
Das Rest Projekt kann nicht abgeschafft werden, denn für die schreibenden Aktionen wollen wir die offiziellen Schnittstellen weiterhin benutzen.
Nehmen wir die implizite Implementierung des Interfaces, würden wir einen Rework in den Methoden benötigen, denn innerhalb dieser wurde mit den Klassen gearbeitet.
Die explizite Implementierung würde einen Cast erfordern. Die Ergebnisklassen können bis zu 10000 Elemente lang sein
Daher die grundsätzliche Frage; Welcher Weg ist zu bevorzugen und wieso?
Beispiel Code:
C#:
public interface IMyResult
{
string MyProperty { get; set; }
}
public interface IResultListCollection
{
ICollection<IMyResult> Results { get; }
void DoWork();
}
public class Result1 : IMyResult
{
public string MyProperty { get; set; }
}
public class Result2 : IMyResult
{
public string MyProperty { get; set; }
}
//Implementation with explicit Interface
public class ResultList1_Solution1 : IResultListCollection
{
public List<Result1> Results { get; set;}
ICollection<IMyResult> IResultListCollection.Results => Results.Cast<IMyResult>().ToList();
public void DoWork()
{
Results = new List<Result1>();
for (int i = 0; i < 100; i++)
{
Result1 result = new Result1();
result.MyProperty = $"test {i}";
Results.Add(result);
}
}
}
//Implementation with explicit Interface
public class ResultList2_Solution1 : IResultListCollection
{
public List<Result2> Results { get; set; }
ICollection<IMyResult> IResultListCollection.Results => Results.Cast<IMyResult>().ToList();
public void DoWork()
{
Results = new List<Result2>();
for (int i = 0; i < 100; i++)
{
Result2 result = new Result2();
result.MyProperty = $"test {i}";
Results.Add(result);
}
}
}
//Implementation with implicit Interface
public class ResultList1_Solution2 : IResultListCollection
{
public ICollection<IMyResult> Results { get; set; }
public void DoWork()
{
Results = new List<IMyResult>();
for (int i = 0; i < 100; i++)
{
Result1 result = new Result1();
result.MyProperty = $"test {i}";
Results.Add(result);
}
}
}
//Implementation with implicit Interface
public class ResultList2_Solution2 : IResultListCollection
{
public ICollection<IMyResult> Results { get; set; }
public void DoWork()
{
Results = new List<IMyResult>();
for (int i = 0; i < 100; i++)
{
Result2 result = new Result2();
result.MyProperty = $"test {i}";
Results.Add(result);
}
}
}