msdn Austria [MS]: Windows Phone 7 Mango Development–18. August in Wien
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.
If x.
ErrorMessage = "Success"
Else
ErrorMessage = x.
End If
Return x.
Else
Return False
End If
Catch ex As Exception
ErrorMessage = ex.Message
Return False
End Try
End Function
End Class
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: 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! 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: 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: Zur Verdeutlichung sehen wir uns ein kleines Beispiel an. Dieses verwendet folgende Bestandteile: 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. 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. 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. Die beispielhaften Tests prüfen nun das Hinzufügen eines neuen Benutzers, als auch die Sortierung der Benutzerliste. Idealerweise mit positivem Ergebnis :) Dieses Beispiel zeigt zum Einen die Verwendung eines Repositories und wie dessen reine Funktionalität getestet werden kann. Nachfolgend findet sich der Download des Repository Beispiels inklusive der angesprochenen Tests und aller notwendigen Libraries. 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.
Repository Pattern
Beispiel
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);
}
}Repositories testen
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);
}
}
}Download Repository Beispiel
Fazit
msdn Austria [MS]: //build/ Konferenz - 13. - 16. September, Anaheim, Kalifornien
Die heurige //build/ Konferenz ist die wichtigste Entwicklerkonferenz seit langem. //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. 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. 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
Für die Entwicklung von Windows- und Browser Anwendungen wird diese Konferenz richtungsweisend sein. Melden Sie sich daher noch heute an: www.buildwindows.com/
Technet Austria
//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/!
msdn Austria [MS]: Nur noch kurze Zeit: Frühbucherrabatt für die //build/ Konferenz - 13. - 16. September, Anaheim, Kalifornien
Die heurige //build/ Konferenz ist die wichtigste Entwicklerkonferenz seit langem. //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.
Für die Entwicklung von Windows- und Browser Anwendungen wird diese Konferenz richtungsweisend sein. Melden Sie sich daher noch heute an: www.buildwindows.com/