Bernhard's profileBernhard Grojer - BlogPhotosBlogLists Tools Help

Blog


    February 28

    Windows Live SkyDrive

    In der Zwischenzeit gibts 5 GB (kostenlos) für den Austausch von Dateien. Freigabe auf LiveID Ebene, als Backup für sich selbst oder generell für die Öffentlichkeit.

    Super einfach fürn schnellen Dateiaustausch.

    Mehr Infos gibts hier: SkyDrive Team Blog

    February 14

    Windows Vista SP1 RTM - Verfügbar


    Nachdem es mit der Fertigstellung von Vista SP1 etwas Verwirrung gab kann ab sofort via Technet Plus ab sofort VISTA SP1 runterladen.

    Mehr Infos gibts hier: http://technet.microsoft.com/de-de/subscriptions/default.aspx

    February 02

    ObjectDataSource - LINQ - BusinessObjects - Entitys (Part 2 - Workaround)

    Wie bereits in meinem Blogeintrag berichtet ist die Verwendung der ObjectDataSource in Verbindung mit LINQ nicht völlig unproblematisch.

    Eine Lösung wäre es, wenn wir die ObjectDataSource durch unsere eigene Implementierung ersetzen können. Doch dies hätte zur folge, dass wir die DesignTools nicht mehr verwenden können und außerdem dediziert in JEDE Website eingreifen müssen.

    Auf der Suche nach einen Lösungsansatz bin ich auf die Idee gekommen <tagMapping> zu verwenden. Damit lässt sich eine eigene Klasse verwenden, die von der Basisklasse abgeleitet ist. Somit sind wir dem Problem schon einen Schritt näher gekommen.
    Schnell werden wir allerdings wieder enttäuscht werden, da sich die "Update, Insert, Delete, ..." Methoden NICHT überschreiben lassen.

    Allerdings benutzt die ObjectDataSource intern eine Instanz/Klasse vom Type ObjectDataSourceView. Bei dieser Klasse ist es möglich, die Methoden (Update, Insert, ...) entsprechend unserer Wünsche abzuleiten.

    Bleibt nur noch die Frage, wie wir unsere eigene (abgeleitete) Implementierung des ObjectDataSourceView in unsere ObjectDataSource einfügen.

    Im Konstruktor der unserer abgeleiteten ObjectDataSource haben wir mittels Reflection allerdings eine Möglichkeit:

    var currentEntityObjectDataSourceView = new EntityObjectDataSourceView(this, DefaultViewName, Context);
    var targetField = typeof(System.Web.UI.WebControls.ObjectDataSource).GetField("_view", BindingFlags.Instance | BindingFlags.NonPublic);
    targetField.SetValue(this, currentEntityObjectDataSourceView);
    if (IsTrackingViewState)
        ((IStateManager)currentEntityObjectDataSourceView).TrackViewState();

    Somit haben wir eine kompatible ObjectDataSource die automatisch durch tagMapping anstatt der orig. Version benutzt wird.
    Intern wird eine abgeleite Version der ObjectDataSourceView benutzt, die wir mittels Reflection ausgetauscht haben.