Glengamoi (Forum) · AspHeute (Artikel) · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
spacer

msdn Austria [MS]: Windows Phone 7 Mango Development–18. August in Wien

spacer

das erwartet sie: Überblick über Konzept & Entwicklung, Entwicklung mit Silverlight & XNA und die Neuerungen mit Mango

wann: 18. August 14:00 – 17:00 Uhr

wo: Sektor5, Siebenbrunnengasse 44, 1050 Wien

mit: Andi Schabus, Technology Advisor, Microsoft Österreich

>>anmeldung

Mit Windows Phone 7 hat Microsoft seine Phone Plattform komplett erneuert und auch die Benutzer Schnittstelle vollständig überarbeitet. Zuerst schauen wir uns an, welche Konzepte und Ideen hinter diesem Re-Design stehen und warum manche Dinge so sind, wie sie sind – Stichwort: Metro.
Im zweiten Teil beschäftigen wir uns mit der Programmierung für diese Plattform, den verfügbaren Tools, den Programmiermodellen und Services usw. – Stichwort: Silverlight & XNA.
Und als Abschluss werfen wir einen Blick auf die nächste Version des Windows Phone und schauen uns einige der darin enthaltenen Neuerungen genauer an – Stichwort: Mango.

Chris Cluss: Encoding bei Fitsms

Mit Fitsms kann man SMS versenden und zwar durch Aufruf einer URL und entspechenden Requestparametern.

Eigentlich kein Problem, nur reicht ein Standard httpUtility.UrlEncode nicht um Sonderzeichen zu übergeben.
Die benötigte Codierung ist Windows-1252, was ich durch Try'nError herausgefunden habe.
Aber auch das reicht noch nicht da das Zeichen "ü" zu %fc wird und fitSMS codierte Zeichen aber in uppercase verlangt.

Heraus kommt als Lösung folgendes:


Public Class smsGateWay

    Private _username As String
    Public Property userName() As String
        Get
            Return _username
        End Get
        Set(ByVal value As String)
            _username = value
        End Set
    End Property

    Private _password As String 
    Public Property password() As String
    
    Get
            Return _password
        End Get
        Set(ByVal value As String)
            _password = value
        End Set
    End Property

    Private _SMSKennung As String 
    Public Property SMSKennung() As String
        Get
            Return _SMSKennung
        End Get
        Set(ByVal value As String)
            _SMSKennung = value
        End Set
    End Property

    Public Result As XElement
    Public ErrorMessage As String = ""

    Function getFromURL(ByVal url As String) As String
        Dim request As System.Net.WebRequest = System.Net.WebRequest.Create(url)
      
        Dim response As System.Net.WebResponse

        response = request.GetResponse()

        Dim responseStream As System.IO.Stream = response.GetResponseStream()

        Dim reader As System.IO.StreamReader = New System.IO.StreamReader(responseStream)

        Return reader.ReadToEnd()

    End Function

    Public Shared Function UrlEncodeUpperCase(value As String, e As Text.Encoding) As String
        value = HttpUtility.UrlEncode(value, e)
        Return Regex.Replace(value, "(%[0-9a-f][0-9a-f])", Function(c) c.Value.ToUpper())
    End Function

    Public Function sendTextSMS(text As String, MobileNumber As String) As Boolean
        Dim url As String = "https://gateway.fitsms.de/sms/http2sms.jsp?" & _
                                "username=" & userName & _
                                "&password=" & password & _
                                "&type=text&" & _
                                "from=" & SMSKennung & _
                                "&to=" & MobileNumber & _
                                "&content=" & UrlEncodeUpperCase(text, Encoding.GetEncoding("Windows-1252"))

        Dim s = getFromURL(url)

        Try
            Dim x As New XElement(XElement.Parse(s))
            Result = x
            If x..Count > 0 Then
                If x..First.Value = "SUCCESS" Then
                    ErrorMessage = "Success"
                Else
                    ErrorMessage = x..First.Value
                End If
                Return x..First.Value = "SUCCESS"
            Else
                Return False
            End If
        Catch ex As Exception
            ErrorMessage = ex.Message
            Return False
        End Try

    End Function


End Class 
spacer

Norbert Eder: Das Repository Pattern anhand eines Beispiels inkl. Tests

Wer kennt es nicht? Abfragen an Datenquellen über die ganze Anwendung verteilt. Dort mal eine Abfrage, dort mal eine Abfrage und häufig deckt sich der dabei verwendete Code auch noch. Manchmal mit kleinen Abweichungen, aber ob dies ein Bug ist, kann schon lange niemand mehr beantworten. Dann auch noch Änderungen an einer der angebundenen Datenquellen und schon wird der Sourcecode durchforstet, in der Hoffnung, alle darauf aufbauenden Stellen zu finden.

Ein alltägliches Szenario, das es so nicht geben müsste. Aber in zahlreichen Anwendungen findet sich immer wieder dasselbe Bild:

  • Zugriffe auf dieselben Datenquellen an unterschiedlichsten Stellen
  • Doppelter Code an allen Ecken und Enden
  • Workarounds um zumindest an einigen Stellen etwas ähnliches wie Caching anzubieten
  • Kaum Tests (da man ohnehin nicht weiß wo man mit dem Testen beginnen sollte und wie man daraus einen sinnvollen Unit Test gestaltet)

Angesprochen darauf erhält man vielfach die Rückmeldung, dass es sich doch um ein gewachsenes System handelt. Das alles erschlagende Argument. Und das bei Projekten, die teilweise noch kein Jahr am Rücken haben. Das muss so nicht sein!

Repository Pattern

Salopp gesagt entspricht das Repository Pattern der Auftrennung zwischen Businesslogik und der Datenbeschaffung, unabhängig der Datenquelle. Wie bereits oben beschrieben wird häufig in der Businesslogik auf Datenquellen zugegriffen, um diverse Daten zu laden, diese in Objekte zu mappen und um diese anschließend anzuzeigen und/oder zu manipulieren. Nun stelle man sich eine größere Anwendung vor. Quer durch sämtliche Businesslogik wird nun auf Daten zugegriffen um diese zu manipulieren. Jedes Mal derselbe Code.

Ein Repository bringt eine zentrale Zuständigkeit ins Spiel. Nämlich eine zentrale Stelle, die sich darum kümmert, den Zugriff zu Entität XY zu gewähren (woher auch immer) und eine Anlage/Änderung in einem korrekten Zustand weiter zu leiten. Die Businesslogik selbst verwendet das jeweilige Repository um auf die Daten zuzugreifen mit dem Vorteil, dass alle relevanten Stellen denselben Code durchlaufen. Dieser muss dementsprechend nur an einer einzigen Stelle gewartet werden. Selbst Änderungen an der Datenbeschaffung selbst bleibt der Businesslogik verborgen, da nur für das Repository relevant.

Hinweis: Man stelle sich vor, dass bestimmte Daten nun nicht mehr direkt aus einer Datenbank, sondern von einem Service bezogen werden. Bei direkter Einbindung in die Businesslogik müssen zahlreiche Stellen nachgezogen werden. Dies ist mühsam und birgt natürlich immer wieder eine gewisse Fehleranfälligkeit in sich.  Eine Pflege an zentraler Stelle ist hier definitiv vorzuziehen.

Grafisch könnte man die Interaktionen so darstellen:

spacer

Dabei ist anzumerken, dass das Repository selbst eigentlich nicht für die Datenbeschaffung zuständig ist, sondern lediglich einen Zugriff darauf zur Verfügung stellt. Dafür sprechen mehrere Gründe:

  • Die durch ein Repository zu ladende Daten können aus mehreren unterschiedlichen Datenquellen stammen.
  • Das Repository bietet "Hilfsmethoden" an, die durch die Datenquelle (beispielsweise ein Service) nicht angeboten wird.
  • Kapselung der Datenquelle an eine zentrale - testbare - Stelle und somit einfacher Tausch bei Notwendigkeit.

Beispiel

Zur Verdeutlichung sehen wir uns ein kleines Beispiel an. Dieses verwendet folgende Bestandteile:

spacer

Dabei stellt die Klasse DefaultPersistenceService die Basis der Datenbeschaffung dar. Das UserRepository stellt Methoden zum Umgang mit Objekten des Typs User zur Verfügung. Dabei bietet die Klasse UserRepository Methoden an, die nicht durch das Service abgedeckt werden. So kann im zu Grunde liegenden Beispiel eine Benutzerliste nach dem Benutzernamen sortiert werden.

public class UserRepository
{
private IPersistenceService PersistenceService { get; set; }

public UserRepository(IPersistenceService persistenceService)
{
PersistenceService = persistenceService;
}

public User GetUserById(long id)
{
return PersistenceService.GetById<User>(id);
}

public IList<User> GetUsersSortedByUsername()
{
List<User> allUsers = PersistenceService.GetAll<User>() as List<User>;

allUsers.Sort(new UserNameComparer());

return allUsers;
}

public void SaveOrUpdate(User user)
{
PersistenceService.Save(user);
}
}

Eine Sortierung der Benutzer nach Benutzername wird durch die Methode GetUsersSortedByUsername angeboten. Dies ist in diesem Beispiel die einzige Methode des Repositories, das zusätzliche Logik mit sich bringt. Grundsätzlich wären hier jedoch weitere Möglichkeiten denkbar.

Repositories testen

Ein zentraler Vorteil der Repositories ist, dass diese ordentlich getestet werden können. In unserem Beispiel hat das UserRepository eine Abhängigkeit zu einem IPersistenceService. In der laufenden Anwendung wird diese Abhängigkeit mittels Autofac gefüllt. Dies ist in unserem Unit Test des Repositories nicht erwünscht. Daher muss die Schnittstelle gemockt werden. Dazu wurde moq in das Beispiel integriert.

Hinweis: Eine reale Implementierung der Schnittstelle IPersistenceService würde mit Sicherheit eine externe Ressource - beispielsweise eine Datenbank - anbinden. Eine Verwendung wäre daher in Integrationstests sinnvoll, jedoch nicht in einem Unit Test.

Ein Blick in die Methode Setup zeigt hier schon, wie ein Mock der Schnittstelle IPersistenceService erstellt wird. Damit das Service auf Anfragen entsprechend reagieren kann, wird definiert, was genau beim Aufruf der Methoden Save, GetById und GetAll geschehen soll. Im letzten Schritt der Test-Initialisierung wird das UserRepository erstellt und kann verwendet werden.

using System.Collections.Generic;
using System.Linq;
using DevTyr.RepositoryPattern.Contracts;
using DevTyr.RepositoryPattern.Models;
using DevTyr.RepositoryPattern.Repositories;
using DevTyr.RepositoryPattern.Services;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

namespace DevTyr.RepositoryPattern.Test
{
[TestClass]
public class UserRepositoryTests
{
private List<User> persistedUsers = new List<User>();
private UserRepository userRepository;

[TestInitialize]
public void Setup()
{
Mock<IPersistenceService> persistenceMock = new Mock<IPersistenceService>();

persistenceMock.Setup(service => service.Save(It.IsAny<object>())).Callback<object>(
item =>
{
(item as IInstanceIdentifier).Id = persistedUsers.Count() + 1;
persistedUsers.Add(item as User);
}
);

persistenceMock.Setup
(
service => service.GetById<User>(It.IsAny<long>())
)
.Returns<long>
(
item => persistedUsers.Where(user => user.Id == item).FirstOrDefault()
);

persistenceMock.Setup(service => service.GetAll<User>()).Returns(persistedUsers);

userRepository = new UserRepository(persistenceMock.Object);
}

[TestMethod]
public void it_should_be_possible_to_add_a_new_user()
{
long expectedUserId = 1;

var user = new User
{
Username = "firstuser",
FirstName = "Norbert",
LastName = "Eder",
Password = "firstuser"
};

userRepository.SaveOrUpdate(user);

var persistedUser = userRepository.GetUserById(1);

Assert.IsNotNull(persistedUser, "User was not persisted, otherwise it shouldn't be null");
Assert.AreEqual<long>(expectedUserId, persistedUser.Id);
}

[TestMethod]
public void username_eder_should_be_infront_of_maier()
{
int expectedListCount = 2;
string expectedFirstUsername = "eder";
string expectedSecondUnsername = "maier";

var maierUser = new User
{
Username = "maier"
};

var ederUser = new User
{
Username = "eder"
};

userRepository.SaveOrUpdate(maierUser);
userRepository.SaveOrUpdate(ederUser);

var users = userRepository.GetUsersSortedByUsername();

Assert.AreEqual<int>(expectedListCount, users.Count());
Assert.AreEqual<string>(expectedFirstUsername, users[0].Username);
Assert.AreEqual<string>(expectedSecondUnsername, users[1].Username);
}
}
}

Die beispielhaften Tests prüfen nun das Hinzufügen eines neuen Benutzers, als auch die Sortierung der Benutzerliste. Idealerweise mit positivem Ergebnis :)

spacer

Dieses Beispiel zeigt zum Einen die Verwendung eines Repositories und wie dessen reine Funktionalität getestet werden kann.

Download Repository Beispiel

Nachfolgend findet sich der Download des Repository Beispiels inklusive der angesprochenen Tests und aller notwendigen Libraries.

Fazit

Bei einer Neuentwicklung ist es sehr ratsam, auf dieses Pattern zu setzen, da vor allem im Zusammenspiel mit Unit Tests eine stabile Schicht geschaffen werden kann. Um jedoch die beschriebenen Nachteile, wie doppelter Code etc. in den Griff zu bekommen, empfiehlt es sich auch, bestehende Implementierungen nachzuziehen. Natürlich ist es schwierig ein bestehendes System derart in der Basis zu verändern, zumal viele Stellen davon betroffen sind. Man sollte sich jedoch vor Augen halten, dass die Qualität wesentlich gesteigert wird und zukünftige Erweiterungen einfacher von der Hand gehen.

msdn Austria [MS]: //build/ Konferenz - 13. - 16. September, Anaheim, Kalifornien

spacer

Die heurige //build/ Konferenz ist die wichtigste Entwicklerkonferenz seit langem.
Für die Entwicklung von Windows- und Browser Anwendungen wird diese Konferenz richtungsweisend sein. Melden Sie sich daher noch heute an: www.buildwindows.com/

//build/ Angebot: Für alle kurzentschlossenen hat Microsoft zudem ein zeitlich limitiertes Angebot: Melden Sie sich bis spätestens 1. August für die //build/ an und Sie erhalten einen Rabatt von USD 500.-

Zur Anmeldung bzw. den Anmeldedetails kommen Sie über die //build/ Webseite: www.buildwindows.com/ Nutzen Sie die Chance und tauchen Sie mit uns in die Tiefen von Windows 8 – die Teilnahme lohnt sich.

spacer spacer spacer

Was ist die //build/ Konferenz?

//build/ ist eine neue Konferenz. Hier erfahren Hardware- und Software Entwickler, wie man zukünftig moderne Windows Lösungen entwickeln kann. Lernen Sie, wie Sie mit der Touch-Centric User Experience schnelle und flüssige Anwendungen erstellen, die die Leistungsfähigkeit und Flexibilität von Windows verwendet.

spacer Erleben Sie, wie die neue Benutzeroberfläche nahtlos mit einer Vielzahl von Geräten und Formfaktoren zusammenzuarbeitet. Blicken Sie hinter die Kulissen und erfahren Sie alles über das neue Applikations-Modell. Diese lässt Sie leistungsstarke neue Anwendungen erstellen. Sowohl mit Netz-verbundenen als auch Web-Applikationen haben Sie Zugriff auf die volle PC-Leistung mittels HTML5 und JavaScript. Touch-optimiertes Browsen, mit der vollen Hardwarebeschleunigung von Internet Explorer 10 bringt eine neue Weberfahrung.

//build/ Team Österreich: Wir begleiten Sie - werden Sie Teil der „österreichischen Delegation“:

Microsoft Österreich wird mit fast der kompletten DPE (Developer Platform und Strategy Group) ebenfalls vor Ort sein. Wir stehen Ihnen daher gerne persönlich bei Fragen als Ansprechpartner zur Verfügung, und freuen uns auf den Austausch und die Diskussionen rings um die Neuigkeiten vor Ort. Als persönlicher Ansprechpartner des österreichischen DPE Teams ist auch Gerhard Göschl (Gerhard.Goeschl@Microsoft.com) direkt vor Ort in Anaheim präsent.

Connect with us:

CodeFest.at

Technet Austria

spacer spacer spacer

spacer spacer spacer

//build/ Newsgroup:

Wenn Sie an der Konferenz teilnehmen oder über eine Teilnahme nachdenken, schicken Sie bitte Ihre Kontaktdaten an (Gerhard.Goeschl@Microsoft.com), damit wir Sie in unseren Österreich Verteiler zur BUILD aufnehmen können. Auf diesem Weg erhalten Sie alle verfügbaren und relevanten Informationen vorab und können damit zielgerichtet und vorbereitet in die Veranstaltung starten.

//build/ Österreicher Abend:

Wie schon im Blogost Build Konferenz: Österreicherabend am 12.09.2011 geschrieben haben werden wir am Vorabend der //build/ für alle teilnehmenden Österreicher eine Welcome Reception veranstalten. Um uns die Planung zu erleichtern, ersuchen wir um eine kurze Rückmeldung per E-Mail an Gerhard Goeschl (Gerhard.Goeschl@Microsoft.com). So können wir ihnen dann auch die Details zum Österreicher Abend zeitgerecht zukommen lassen.

Wir würden uns freuen gerade Sie im August in Anaheim begrüßen zu können, auf Wiedersehen auf der //build/!

spacer

msdn Austria [MS]: Nur noch kurze Zeit: Frühbucherrabatt für die //build/ Konferenz - 13. - 16. September, Anaheim, Kalifornien

spacer

Die heurige //build/ Konferenz ist die wichtigste Entwicklerkonferenz seit langem.
Für die Entwicklung von Windows- und Browser Anwendungen wird diese Konferenz richtungsweisend sein. Melden Sie sich daher noch heute an: www.buildwindows.com/

//build/ Angebot: Für alle kurzentschlossenen hat Microsoft zudem ein zeitlich limitiertes Angebot: Melden Sie sich bis spätestens 1. August für die //build/ an und Sie erhalten einen Rabatt von USD 500.-

Zur Anmeldung bzw. den Anmeldedetails kommen Sie über die //build/ Webseite: www.buildwindows.com/ Nutzen Sie die Chance und tauchen Sie mit uns in die Tiefen von Windows 8 – die Teilnahme lohnt sich.

gipoco.com is neither affiliated with the authors of this page nor responsible for its contents. This is a safe-cache copy of the original web site.