Generische Tabelle<TEntity>

Versuchen, Linq to SQL für ein kleines Projekt an dem ich arbeite zu Hause. Ich habe erzeugt ein Rahmen-code und alle meine entity-Klassen mit dbmetal.exe (aus dem DBLinq Projekt) gegen eine lokale MySQL-Datenbank.

Alles funktioniert Super, aber ich bin versucht zu abstrahieren, einige redundante code, und ich bin in Probleme laufen, die versuchen, so zu tun.

Grundsätzlich alle meine Entitäten sind vom Typ Table<TEntity> in meinem Rahmen-Klasse. Ich habe zum Beispiel Table<User> und Table<Calendar>.

Während ich die Architektur, die verschiedenen Schnittstellen für das repository Verhalten erkannte ich, dass es einige Methoden, die waren sehr redundant mit jeder Entität. Zum Beispiel das Feld ID:

User findById(int id);
Calendar findById(int id);

Entwarf ich meine Tabellen so haben Sie alle 3 Felder in common [ID, DATECREATED, DATEUPDATED]. Da diese Felder sind Häufig wollte ich haben ein gemeinsames Verhalten, anstatt umschreiben jene Methoden, die für jede Entität.

Also machte ich mich auf repository-Klassen (UserRepository, CalendarRepository) Erben einen gemeinsamen "Repository" - Klasse definiert so:

public class Repository<T> : IDisposable, IRepository<T> where T : class
{
    protected MyContext context;

    private DbLinq.Data.Linq.Table<T> currentTable;

    protected Repository() {
        context = new MyContext();

        Type currentType = this.GetType().GetGenericArguments()[0];
        currentTable = //Set currentTable based on currentType. e.g.: currentTable = context.User;
    }        

    #region IRepository<T> Members

    public T findById(int? id)
    {
        return currentTable.SingleOrDefault(d => d.ID == id);
    }

    public T findByDateCreated(DateTime dateCreated)
    {
        return currentTable.SingleOrDefault(d => DateTime.Equals(dateCreated, d.DateCreated));
    }

    public T findByDateUpdated(DateTime dateUpdated)
    {
        return currentTable.SingleOrDefault(d => DateTime.Equals(dateUpdated, d.DateUpdated));
    }

    public T insert(T domainObject)
    {
        currentTable.InsertOnSubmit(domainObject);
        return domainObject;
    }

    public T save(T domainObject)
    {
        context.SubmitChanges();
        return domainObject;
    }

    #endregion

    #region IDisposable Members

    public void Dispose()
    {
        if (context != null)
            context.Dispose();
    }

    #endregion
}

Nun, es stellt sich heraus, das ist schwieriger als ich dachte. Wenn ich versuche zu setzen:

currentTable = (Table<T>)context.User;

Bekomme ich die folgende Fehlermeldung:

Cannot convert type 'DbLinq.Data.Linq.Table<Models.Domain.User>' to 'DbLinq.Data.Linq.Table<T>'

Implizite Typumwandlung nicht funktioniert.

Jemand mal etwas ähnliches gemacht erfolgreich? Das wäre sehr traurig, wenn ich hatte, haben alle meine Repository-Klassen implementieren die gleichen findById-Methode mit genau den gleichen code in es... ich bin mir sicher es gibt einen Weg, um das NICHT zu tun, ich kann einfach nicht finden. 🙂

  • ist es andernfalls zur compile-Zeit oder zur Laufzeit?
InformationsquelleAutor Lancelot | 2009-11-07
Schreibe einen Kommentar