Aktualisierung 2 : @Enigmativity hat eine brillante Antwort. Ich habe dies in eine IObservableRepository<T>
. Einzelheiten in meiner Antwort unten.
Frage: Ich habe also das meiste an der Frage geändert (siehe Bearbeitungshistorie) und würde mich freuen, wenn jemand meinen Entwurf kommentiert/bestätigt/ausgekotzt hätte =)
Normalerweise sehen meine Repos also so aus:
public interface IRepository<T> where T : class
{
T GetById(int id);
IQueryable<T> GetAll();
void InsertOnSubmit(T entity);
void DeleteOnSubmit(T entity);
int SubmitChanges();
}
Aber wenn es um Silverlight und WCF-Datendienste geht, wird die Abfrage von Daten mit all der Asynchronität sehr lästig. Ich muss zuerst die übergeordnete Entität asynchron laden und dann die untergeordneten Entitäten asynchron abfragen.
Also habe ich mir etwas einfallen lassen IAsyncRepository
Ich würde gerne wissen, ob das Design in Ordnung ist, ob es verbessert werden kann (und ob es sinnvoll ist, Rx hier zu verwenden).
Um das Problem der untergeordneten Einheiten zu lösen, plane ich, alle erforderlich untergeordneten Entitäten vor dem Aufruf des Rückrufs.
Mein Repo sieht so aus:
public interface IAsyncRepository<T> where T : class
{
void GetById(int id, Action<T> callback);
void GetAllFromQuery(Func<MyEntities, IQueryable<Product>> funcquery,
Action<IList<Calculator>> callback)
}
Sie könnten das Repo wie folgt verwenden:
productRepo.GetAllFromQuery(
x => x.Products.Where(p => p.ID > 5),
y => Assert.IsTrue(y.Count > 0)); //y is a IList<Product>
Was haltet ihr davon?
Herzliche Grüße, Gideon