Windows Mobile Support

  • Subscribe to our RSS feed.
  • Twitter
  • StumbleUpon
  • Reddit
  • Facebook
  • Digg

Thursday, 31 March 2011

Cum sa scriem un xPath cand avem definit si un namespace

Posted on 03:36 by Unknown
Cand vrem sa aplicam un xPath pe un xml ce conține si un namespace lucrurile se complica.
De exemplu daca pornim de la urmatorul xml:
<?xml version="1.0" ?>
<x xmlns="http://www.xyz.com/">
<y>1</y>
<y>2</y>
</x>
Daca dorim sa aplicam un xPath am scrie un cod asemanator cu acesta:
var xmlDoc = new XmlDocument();
xmlDoc.Load(sursa);
var nodes = xmlDoc.SelectNodes(@"/x/y");
Din pacate din cauza ca in xml este definit un namespace, acest lucru nu o sa functioneze. Numarul de noduri returnate va fi mereu 0. Pentru a putea rezvolta aceasta problema trebuie sa adaugam si un namespace, codul rezultat ajungand sa arate in felul urmator:
var xmlDoc = new XmlDocument();
xmlDoc.Load(sursa);
var nameSpaceManager = new XmlNamespaceManager(xmlDoc.NameTable);
nameSpaceManager.AddNamespace("nm","http://www.xyz.com/");
var nodes = xmlDoc.SelectNodes(@"/nm:x/nm:y",nameSpaceManager);
Dezavantajul la aceasta solutie este modul in care suntem nevoiti sa scriem xPath-ul. La fiecare nod trebuie sa adaugam "nm". O alta varianta este sa ignoram in totalitate namespace-ul. Acest lucru il putem face cand incarcam documentul.
var xmlDoc = new XmlDocument();
using (XmlTextReader xmlTextReader = new XmlTextReader(path))
{
xmlTextReader.Namespaces = false;
xmlDoc.Load(xmlTextReader);
}
var nodes = xmlDoc.SelectNodes(@"/x/y");

Enjoy!
Read More
Posted in namespace, no result, select nodes, xmlns, xpath | No comments

Tuesday, 29 March 2011

Blob content type - Windows Azure

Posted on 05:06 by Unknown
La fiecare blob din Windows Azure se poate seta content type. De cele mai multe ori acest parametru trece neobservat.
Mai jos este un exemplu care arata cum se poate schimba aceasta valoare:
Paste your text here.var blob = Container.GetBlockBlobReference("numeBlob");
blob.Properties.ContentType = "application/octet-stream";
Cand aceasta propietate devine utila? In momentul in care vrem sa stocam pe blob resurse statice. De exemplu vrem sa adaugam un CSS pe blob, iar href pentru CSS sa fie spre adresa din blob. Pentru ca aceasta solutie sa functioneze pe orice brower( Firefox are nevoie de un content type valid) este nevoie sa setam valoarea la content type egala cu "text/css".
var blob = Container.GetBlockBlobReference("numeBlob");
blob.Properties.ContentType = "text/css";
Daca aceasta valoare nu este setata pe Firefox nu o sa se incarce deloc CSS-ul, desi adresa setata este valida.
Read More
Posted in Azure, blob, content type, css, static | No comments

Monday, 28 March 2011

Nivele de acces pentru containerele din Windows Azure.

Posted on 11:19 by Unknown
Pe blob-urile din Windows Azure putem sa stocam orice fel de conținut, de la poze si filme la carti sau arhive. Cand vrem sa partajam aceasta informație cu alte persoane apare mai multe intrebari:
  • Ce poate sa faca un utilizator pe blob?
  • Ce poate sa faca un utilizator pe container?
  • Un utilizator are dreptul sa acceseze container-ul si sa il parcurgă?
La nivel de container putem sa setam trei nivele de acces. Varianta pe care o alegeți trebuie aleasa cu grija, deoarece aceasta va afecta in mod direct modul in care un utilizator anonim poate sa acceseze un blob.
Prima varianta este "Full public read access". Un utilizator anonim poate sa citească din orice blob sau container. Acesta poate sa itereze in interiorul container. Singurul lucru pe care nu il poate sa faca este sa intereze prin containere.
A doua varianta este "Public read access for blobs only". Aceasta se aseamana cu prima varianta, doar ca un utilizator nu poate sa itereze prin conținutul unui container.
Ultima si cea mai restrictiva din variante este "No public read access". In acest caz un utilizator anonim nu poate sa citească sau sa parcurgă nici un blob sau container.
Pentru a putea seta aceste valori avem la dispozitie enum-ul BlobContainerPublicAccessType.
In exemplul de mai jos setam acest flag la al doilea nivel:
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
var container = blobClient.GetContainerReference("abcdefg");
container.CreateIfNotExist();
var permissions = container.GetPermissions();
permissions.PublicAccess = BlobContainerPublicAccessType.Container;
container.SetPermissions(permissions);

Read More
Posted in Azure, blob, BlobContainerPublicAccessType, container, nivel acces | No comments

Sunday, 27 March 2011

New mLearning Authoring Tools – Wave #2

Posted on 18:16 by Unknown
Another month, another trip to Orlando it seems and last week had me attending two different shows down near the Mouse House; Learning Solutions 2011 and CTIA Wireless 2011. This first post will focus on LS2011 and I’ll post again on CTIA tomorrow.

The Learning Solutions 2011 Event. The eLearning Guild’s LS2011 event was well attended and features 50+ vendors and more than 1300 participants from the training and development industry.  The Guild continues to put on a great show although the focus on mobile learning at this show is somewhat muted given their upcoming mLearnCon event in San Jose is being held in less than 3 months; the next show will certainly be “all mobile all the time” and a better bet for both the experienced and the curious as it relates to enterprise mobile learning. That said, interest in the various products and sessions and “morning buzz” gatherings that related to mobile all seemed well attended and topical.

I was able to spend time with several different vendors who are all preparing to deliver their own mobile learning offers into the marketplace in the coming months. Much of the need and innovation behind these new products is in direct response to the growing market perception that mobile learning either has or will hit the “tipping point” this year for enterprise adoption and the fact every organization is now faced with questions about how they’ll deliver on this potential and the various expectations being promoted by scores of training departments, sales teams, engineering groups and senior managers waving iPads and Android tablets.

Of the 45+ vendors exhibiting at LS2011, about a dozen had some form of mobile messaging clearly on display and there were certainly a few standouts as follows:

Claro from dominKnow.  Luke Hickey and team over the dominKnow took center stage in the LS2011 exhibits area to herald the launch of their next generation authoring platform called Claro. The new web-based HTML5 authoring package looks and performs quite well and delivers an impressive array of authoring features that can produce exceptionally nice looking mobile content for the various web kit-based mobile devices and tablets including Apple’s iPad and the full range of Android-based tablets. Published modules are packaged as SCORM objects and deployed with nominal hiccups for local/disconnected playback via an installed CellCast application on our test iPhones, iPads and Android devices. We now plan to take the next few steps down the technical integration front to make it easy to publish and deploy a Claro-generated course directly into our CellCast Manager/mLMS platform with “one click” simplicity.  Contact them directly to sign up for the official beta of Claro too!

Storyline from Articulate. I actually got to check out the new Storyline application from Articulate running in pre-beta form this past week and it is impressive and promising on many fronts. Whereas I expected Articulate to simply add some sort of option to "publish to HTML5" to their already popular Presenter add-in to PowerPoint, they actually decided to go a whole new direction and build an application from scratch that looks/functions in much the same way as PowerPoint but the created content is then published in tablet-friendly deliverables. There were plenty of tools to create interactions (ala Engage-style functionality) as well as define animations and path-based motions which all rendered well in the final outputs. And, of course, you can import existing PPT/PPTX presentations right into the new app and manipulate all the sides while still leveraging most of the defined interactions (e.g., slide to slide hyperlinks). For a pre-beta application, it seemed generally polished and stable too meaning it will be great addition to many ID tool kits in the future for those targeting deliverables to high resolution iOS and Android screens -- not sure this will work on many if any BlackBerry devices though.  Articulate expects to issue a select number of public beta invitations sometime in the latter part of Q2 and we’re hoping to participate and provide active feedback for these new tools as they prepare to come to market.  See a screen shot of the application on display from the show below.



mLearning Studio from Rapid Intake.  As detailed in a recent post, Rapid Intake’s new mLearning Studio tools are preparing to hit the market and will enable IDs to publish their content as either Flash or HTML5 packages.  Check it out here.

Questionmark Mobile Apps from Questionmark.  Questionmark was highlighting ways to publish their standard assessments into mobile friendly formats and SCORM packages that can be delivered to and accessed via mobile apps. OnPoint plans to run these offerings through their paces in the coming weeks to see how it all works and performs. Check it out here.

OnQue from Impatica.  Mike Doyle and the Impatica team continue to advance their efforts to produce some great tools that can help publish mobile friendly virtual learning environments to tablet devices like the iPad.  Their latest offering renders content that includes a video stream, a slide deck, notes and other learning resources using a consolidated time line metaphor all using HTML5.  Check it out here. 

Simwriter from NexLearn.  Finally, I had a chance to see one of NexLearn’s simulations – normally a Flash-based deliverable – running on an Apple iPad tablet using a new new delivery format they are working on.  We are already in discussions about how to package, deliver and manage these simulations for disconnected on-device playback and hope to have a way to support them in the coming weeks.


I suspect there will be three times as many interesting and compelling offer announcements across a full range of products and services in the coming months culminating with activities surrounding the mLearnCon event in late June.  These are interesting times indeed!
Read More
Posted in | No comments

Wednesday, 23 March 2011

Cum sa facem handling la evenimente dontr-o pagina HTML afisare printr-un controler Silverlight

Posted on 12:24 by Unknown
Pentru a putea face acest lucru avem nevoie de un mecanism prin care sa trasmitem evenimentul produs. O solutie este javascript.
In Silverlight avem doua controlare care se ocupa cu acest lucru WebBrower si HtmlBrush. Din pacare doar WebBrower stie sa faca handling la evenimente de java script. Prin intermediul acestora codul C# poate sa apele metode javascrip din interiorul paginii pe care o afisam sau sa se inregistreze la anumite evenimente(metode).
Pentru a putea face acest lucru este nevoie sa adaugam in fisierul xaml controlerul care ne permite sa afisam continut HTML:
<WebBrowser  x:Name="browserControl" />

Pasul urmator este sa ne inregistram la notificarea dorita. Aceasta notificare reprezinta un apel a unei metode din javascript.
 browserControl.ScriptNotify += new EventHandler<NotifyEventArgs>(BrowserControl_ScriptNotify);
...
void browserControl_ScriptNotify(object sender, NotifyEventArgs e)
{
...
}
In acest moment toate mesajele de notificare o sa fie prinse si procesate de catre metoda BrowserControl_ScriptNotify. In aceasta metoda parametrul e.Value reprezenta numele la notificarea pe care noi am primito.
In codul HTML pe care noi il afisam in controller, trebuie sa apelam metoda window.external.notify("nume_notificare").
Aceasta metoda se poate apela oriunde in codul javascript sau se poate atasa la tag-uri prin evenimentul onclick de exemplu.
Read More
Posted in click event, handle, HTML, Silverlight, WebBrower | No comments

Monday, 21 March 2011

Cum sa faci deploy din Visual Studio direct in cloud

Posted on 11:46 by Unknown
Visual Studio 2010 ne ofera posibilitatea de a face deploy( publish) la un proiect direct in cloud. Mecanismul prin care se face deploy este asemanator cu cel pentru o solutie web.
Primul pas este sa dam click dreapta pe proiectul care contine rolurile pentru Azure si sa selecta "Publish".
Al doilea pas este selectam "Deploy your Windows Azure project to Windows Azure". O sa avem nevoie sa adaugam credentialele daca acestea nu sunt setate deja. Pentru a putea adauga credentialele avem nevoie sa selectam un certificat( putem sa folosim unul deja existent sau sa generam unul local), iar apoi ID-ul subscripției noastre. Insa aici apare o problema cand vrem sa dam OK. Nu o sa putem sa adaugam credentialele pentru subcriptia noastra pana cand nu inregistram certificatul pe platforma de Windows Azure.
Pentru a inregistra certificatul este nevoie sa il exportam de pe masina noastra folosind tool-ul mmc.exe. Iar apoi este nevoie sa ne logam pe https://windows.azure.com/ si sa mergem la sectiunea "Managment Certificates" de sub "Hosted Services, Storage Account & CDN". In aceasta locatie este nevoie sa adaugam certificatul pe care l-am exportat cu mmc.exe.
Dupa ce am selectat si credentialele, este nevoie doar sa selectam unde vrem sa facem deployment-ul si ce storage vrem sa folosim.
Atentie, nu uitati sa adaugati acest certificatul pe platforma de Windows Azure.
Read More
Posted in Certificate, deploy, visual studio, Windows Azure | No comments

Thursday, 17 March 2011

Cum sa controlam modul in care un serviciu windows porneste din cod

Posted on 12:05 by Unknown
Prin intermediul la clasei ServiceController putem sa controlam un serviciu windows. Il putem in orice moment porni sau oprii. Dar daca avem nevoie sa ii schimbam startup type? De exemplu daca vreau sa ii schimb startup type-ul de pe manual pe automat?
Din pacate ServiceController nu ne oferă aceasta funcționalitate. Din cod C# nu am gasit o posibilitatea prin care as putea sa fac acest lucru. In schimb am gasit in registry bine ascunse aceste valori.
Daca deschidem registrii si ne uitam sub Local System in path-ul "SYSTEM\CurrentControlSet\Services\" o sa gasim lista cu toate serviciile pe care le avem instalate pe masina. Pentru fiecare serviciu avem:
  • nume
  • descriere
  • tipul
  • startup type-ul
  • path-ul spre serviciu
  • etc
Daca schimbam una din aceste valori, sistemul de operare o sa faca update automat la serviciu. O solutie la probleme noastra este sa facem o metoda care scrie valoarea in registri.
public enum StartupModeType
{
Boot = 0,
System = 1,
Automatic = 2,
Manual = 3,
Disabled = 4
}
Mai sus este lista cu starile pe care le poate avea serviciu. Iar mai jos avem cele doua metode care fac get si set la aceasta valoarea:
public StartupModeType GetStartupMode(string serviceName)
{
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(""SYSTEM\\CurrentControlSet\\Services\\" + serviceName);
StartupModeType startupMode = (StartupModeType)registryKey.GetValue("Start");
registryKey.Close();
return startupMode;
}
public void SetStartupMode(string serviceName, StartupServiceMode startupServiceMode)
{
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\Start",RegistryKeyPermissionCheck.ReadWriteSubTree);
registryKey.SetValue(StartupTyeRegistryKey,(int)startupServiceMode);
registryKey.Close();
}
In functie de necesitati putem sa facem niste extension methods la ServiceController care sa se ocupe de acest lucru. O alta varianta era cream un proces nou si sa apelam "sc [numeServiciu] config".
Read More
Posted in sc, servicecontroller, startuptype, windows service | No comments

Monday, 14 March 2011

Definirea unui mecanism de comparare a entitatiilor din punct de vedere a structurii folosind IStructuralEquatable

Posted on 14:13 by Unknown
Uneori avem nevoie sa putem compara clasele de tip POCO ca pe niste structuri. De exemplu daca avem clasa Student, dorim sa comparam entitatile de acest tip din punct de vedere a datelor pe care le contin.
class Student
{
public string Nume{ get;set;}
public string Prenume{ get;set;}
public int Varsta{ get;set;}
}
Pentru acest lucru sa folosim IStructuralEquatable. Aceasta interfata a fost creata pentru a fi folosita in tupluri. In cazul acestora, doua tupluri sunt egale daca fiecare element din tuplu este egal din celalalt tuplu.
Interfata contine doua metode:
bool Equals(Object other, IEqualityComparer comparer);
int GetHashCode(IEqualityComparer comparer);
Prin intermediul parametrului comparer se defineste mecanismul de comparare. Exista cateva implementari in .NET pentru IEqualityComparer prin care putem sa comparam siruriile de elemente - element cu element.
Valoarea default a acestui parametru este EqualityComparer>Object<.Default.Equals in cazul in care se foloseste mecanismul standard de comparare. O alta implementare este StructuralComparisons.StructuralEqualityComparer. Aceasta este folosita cand lucram cu tupluri sau cu clase ce implementeaza IStructuralEquatable.
Dar ne putem defini si noi propriul mecanism de comparare daca implementam IEqualityComparer. De exemplu in cazul nostru am putea sa avem:
public class FullNameComparer
{
public new bool Equals(object s1, object s2)
{
...
var student1 = s1 as Student;
var student2 = s2 as Student;
return student1.Nume == student2.Nume && student1.Prenume == student2.Prenume;
}
}
Pentru a putea compara doi studenti putem sa apelam( clasa Student trebuie sa implementeze IStructuralEquatable):

var student1 = new Student() { ... };
var student2 = new Student() { ... };
bool areEquals = student1.Equals(student2, new FullNameComparer());
Unde ne este utiliza aceasta interfata. Cand avem nevoie sa definim mai multe mecanism de comparare pentru o clasa de un anumit fel. Prin acest mecanism putem foarte usor sa trimitem printr-un parametru modul in care sa se faca compararea. Cel mai bine aceasta interfata se preteaza cand lucram cu tupluri.
Exista nenumarate solutii la aceasta problema, depinde de la caz.
Read More
Posted in compara, comparison, IStructuralEquatable, StructuralEqualityComparer, tuplu | No comments

Sunday, 13 March 2011

MVC 3 - UrlParameter.Optional

Posted on 13:00 by Unknown
Zilele astea am inceput sa ma uit peste MVC 3 si sa vad ce a adus nou. S-a scris foarte mult, nu am de gand sa desfac firul in patru cu fiecare lucru aparut in MVC 3. In schimb vreau sa va spun peste ce problema am dat.
In MVC 2 cand se declara un map route - unul sau mai multi parametrii pot sa fie optionali. In acest caz cand se face apelul unei actiuni, acesti parametri pot sa lipseasca.
De exemplu putem sa avem urmatoarea mapare:
routes.MapRoute(
"Drive",
"drive/go/strada/numar"
controller = "Drive",
new
{
action = "Go",
numar = UrlParameter.Optional
bloc = UrlParameter.Optional
});
Antetul actiuni ar avea forma:
public ActionResult Go(string strada, int? numar,int? bloc);
Apelul spre aceste acțiuni am dorii sa fie de forma:
http://localhost/drive/go?strada=Dunarii
http://localhost/drive/go/Dunarii/10/5
http://localhost/drive/go/Dunarii
O sa observam ca pentru prima varianta http://localhost/drive/go?strada=Dunarii maparea pe care noi am declarato nu functioneaza. Aceasta problema apare cand avem doi parametrii optionali.
O solutie pentru aceasta problema este sa mai declaram o nou map route pentru cazul in care nici un parametrul optional nu este setat:
routes.MapRoute(
"Drive",
"drive/go/strada/numar"
controller = "Drive",
new
{
action = "Go",
});
Read More
Posted in MVC, MVC 3, UrlParameter.Optional, workaround | No comments

Thursday, 10 March 2011

Enumerable.Zip

Posted on 11:25 by Unknown
Daca avem doua liste si este nevoie sa facem merge la elemente doua cate doua in ordinea pozitiei din lista este nevoie sa scriem un cod asemanator cu acesta:
var numeList = new[] { "Ioan", "Gheorghe", "Mihai", "Laurentiu" };
var prenumeList = new[] { "Pop", "Rus", "Ratiu", "Negru" };
var numePrenumeList = new List<string>();
for(int i = 0; i < numeList.Count(); i++)
{
numePrenumeList.Add(numeList[i] + " " + prenumeList[i]);
}

Rezultatul ar fi:
Ioan Pop
Gheorghe Rus
Mihai Ratiu
Laurentiu Negru
Acelasi lucru putem sa il facem daca folosim metoda Enumerable.Zip. Prin intermediul acestei metode putem sa facem merge intre doi vectori element cu element:
var numePrenumeList = numeList.Zip(
prenumeList,
(nume, prenume) => nume + " " + prenume);
Nu o sa avem nevoie de acesta metoda in fiecare zi, dar mi s-a parut o metoda pe care merita sa o cunoastem.
Update:
In cazul in care lungimea la cei doi vectori nu este aceiași, o sa se faca merge doar pana la MIN(lista1.Count,lista2.Count). Desi parca ar fi mai normal sa arunce exceptie.
Read More
Posted in enumerable, linq, Zip | No comments

Wednesday, 9 March 2011

OutputCache in Windows Azure folosind AppFabric.Cache

Posted on 13:14 by Unknown
In post-ul anterior am vorbit despre cum putem sa ne definim propriul nostru mecanism de cache-ing. Dar daca ne aflam in cloud.
Iata urmatorul scenariu: avem o aplicatie MVC 2 pe Windows Azure si vrem sa putem folosii un mecanism de cache-ing. In cazul in care avem mai multe web roluri dorim sa facem un sistem de cache-ing oarecum centralizat. Nu dorim sa încărcam de doua ori anumite date daca acestea sunt deja incarcate.
O varianta pentru a rezolva aceasta problema este sa ne definim propriul mecanism pentru cache-ing. Nu ar fi foarte complicat, dar ne-ar costa ceva timp. Cea mai simpla varianta este sa folosim mecanismul intern de pe Windows Azure. AppFabric ne ofera si posibilitatea sa facem cache-ing la date. Acest provider de cache-ing se numeste DistributedCache, iar pentru al putea folosi este nevoie sa accesam sectiunea de AppFabric din contul de Windows Azure si sa adaugăm un serviciu.
In web.config-ul aplicatiei trebuie sa adauga o noua sectiune prin care sa putem definii providerul din cloud, iar apoi sa scriem definiția propriu-zisa:
<configSections>
<section name="distributedCache"
type="Microsoft.ApplicationServer.Caching.DataCacheClientSection,
Microsoft.ApplicationServer.Caching.Core"
allowLocation="true" allowDefinition="Everywhere"/>
</configSections>
<distributedCache deployment="Simple">
<hosts>
<host name="raduVunvulea.cache.appfabriclabs.com" cachePort="80" />
</hosts>
<securityProperties mode="Message">
<messageSecurity authorizationInfo="43423423DFJF2rf32f23f23f233gt23f3f3">
</messageSecurity>
</securityProperties>
</distributedCache>
Tot ce mai este nevoie este sa adaugam in sectiunea de cache-ing definitia noastra de provider:
<webconfig>
<caching>
<outputCache defaultProvider="DistributedCacheProvider" >
<add name="DistributedCacheProvider"
type="Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider,
Microsoft.Web.DistributedCache"
cacheName="cacheOne" />
</outputCache>
</caching>
</webconfig>
Din acest moment aplicatia noastra o sa poata folosi cache-ing pe care Windows Azure il pune la dispozitie prin intermediul AppFabric. Pentru acest lucru aveti nevoie nu doar de un cont de Windows Azure ci si de un service namespace pe AppFabric, care nu este gratis.
Read More
Posted in App Fabric, cache, outputcache, OutputCacheProvider, Windows Azure | No comments

Tuesday, 8 March 2011

Cum sa definesti un provider custom pentru cache

Posted on 06:06 by Unknown
.NET 4.0 ne-a adus si posibilitatea de a controla output caching. Pana in momentul acesta puteam sa controlam obiectele la care sa se faca cache. Daca de exemplu avem o actiune la care doream sa facem cache, puteam sa folosim atributul OutputCacheAttribute, prin care puteam defini durata la care sa se faca cache si prin ce parametri acest cache sa difere.
[OutputCache(Duration=20, VaryByParam="none")]
public ActionResult GetItems()
{
// Executa ceva.
}
In momentul in care se face un call spre actiunea GetItems, se verifica daca aceasta exista in cache si daca cache-ul este valid( nu a expirat iar parametri trasmisi prin VaryByParam sunt identici). Daca conditiile sunt indeplinite atunci rezultatul se incarca automat din cache si se trimite mai departe, altfel se executa actiunea GetItems, iar rezultatul se salveaza in cache.
In cazul in care dorim sa definim un provider propiu pentru output cache este nevoie sa scriem o clasa ce sa mosteneasca din OutputCacheProvider.
    public abstract class OutputCacheProvider : ProviderBase
{
public abstract object Get(string key);
public abstract object Add(string key, object entry, DateTime utcExpiry);
public abstract void Set(string key, object entry, DateTime utcExpiry);
public abstract void Remove(string key);
}
Prin intermediul metodelor care ne sunt puse la dispozitie, putem sa controlam provider-ul in totalitate.
In web.config este este nevoie sa specificam ce fel de output cache sa se foloseasca:
<caching>
<outputCache defaultProvider="NameOutPutCache">
<providers>
<add name="NameOutPutCache"
type="FullLocationOfOutputCacheImplementation" />
</providers>
</outputCache>
</caching>

Pentru a vedea un exemplu de implementare puteti sa va uitati aici: http://galratner.com/blogs/net/archive/2010/06/06/write-your-own-outputcacheprovider.aspx
Mai jos puteti sa gasiti un exemplu de outputcach provider pentru MongoDb:
 public class MongoDbOutputCacheProvider : OutputCacheProvider, IDisposable
{
readonly Mongo _mongo;
readonly IMongoCollection<CacheItem> _cacheItems;

public MongoDbOutputCacheProvider()
{
// Initializare coneciune la MongoDb
_mongo = new Mongo();
_mongo.Connect();

var store = _mongo.GetDatabase("OutputCacheProviderDB");
_cacheItems = store.GetCollection<CacheItem>();
}

public override object Get(string key)
{
// Se cauta elementul cu cheia dorita.
var cacheItem = _cacheItems.FindOne(new { _id = key });

//Se deserializeaza elementul gasit.
if (cacheItem != null) {
if (cacheItem.Expiration.ToUniversalTime() <= DateTime.UtcNow) {
_cacheItems.Remove(cacheItem);
} else {
return Deserialize(cacheItem.Item);
}
}

return null;
}

public override object Add(string key, object entry, DateTime utcExpiry)
{

if (utcExpiry == DateTime.MaxValue)
{
utcExpiry = DateTime.UtcNow.AddMinutes(5);
}

// Se adauga elementul in baza de date.
_cacheItems.Insert(new CacheItem
{
Id = key,
Item = Serialize(entry),
Expiration = utcExpiry
});

return entry;
}

public override void Set(string key, object entry, DateTime utcExpiry)
{
var item = _cacheItems.FindOne(new { _id = key });

if (item != null)
{
// In cazul in care elementul deja exista se face update la informatii.
item.Item = Serialize(entry);
item.Expiration = utcExpiry;
_cacheItems.Save(item);
}
else
{
// Se insereaza un element nou.
_cacheItems.Insert(new CacheItem
{
Id = key,
Item = Serialize(entry),
Expiration = utcExpiry
});
}
}

public override void Remove(string key)
{
// Se elimina din MongoDb.
_cacheItems.Remove(new { _id = key });
}

private static byte[] Serialize(object entry)
{
var formatter = new BinaryFormatter();
var stream = new MemoryStream();
formatter.Serialize(stream, entry);

return stream.ToArray();
}

private static object Deserialize(byte[] serializedEntry)
{
var formatter = new BinaryFormatter();
var stream = new MemoryStream(serializedEntry);

return formatter.Deserialize(stream);
}

public void Dispose()
{
_mongo.Disconnect();
_mongo.Dispose();
}
}

Implementarea completa se poate gasi aici:
http://archive.msdn.microsoft.com/mag201103OutputCache/Release/ProjectReleases.aspx?ReleaseId=5514
Read More
Posted in ASP.NET, cache, mongoDb, MVC, OutputCacheProvider | No comments

Saturday, 5 March 2011

ReadOnlyCollection

Posted on 09:15 by Unknown
Va mai aduceti aminte ca in C++ puteam sa declaram o variabila sa fie constanta, fara a ne face probleme ca un utilizator ii poate schimba valoarea. In C# putem sa facem un lucru asemanator folosindu-ne de readonly.
public class Car
{
internal readonly int _id;

public Car(int id)
{
_id = id;
}
}
Doar in contructor se va putea initializa field-ul _id. Valoarea acestui camp nu se va putea modifica in nici o locatie din cod. Dar daca in loc de int am aveam o lista, ar aparea probleme. Chiar daca nu se va putea instanta din nou acest camp, continutul acestuia se va putea modifica.
public class Car
{
internal readonly List<Component> _components;

public Car(List<Component> components)
{
_components = components;
}
}

public class Logan : Car
{
// ...

public void SomeMethod()
{
_components.Add(..);
_components.Remove(..);
}
}
Oricine ar putea sa adauge sau sa stearga elemente din lista. Am avea nevoie de o lista care sa permita doar operatii de read. Pentru acest lucru .NET ne vine in ajutor si ne ofera clasa generica ReadOnlyCollection. Aceasta colectie nu contine metode prin care putem sa adaugam elemente sau sa stergem elemente din lista. Totodata indexer-ul ne permite sa facem doar get si atat.
Orice lista contine metoda AsReadOnly(), care ne returneaza o lista de tip ReadOnlyCollection.
List<int> items = new List<int>(){ 1, 2 ,3};
items.Add(4);
items.Remove(1);
items[1] = 10;
ReadOnlyCollection<int> itemsReadOnly = items.AsReadOnly();
itemsReadOnly.Add(4); //Eroare la compilare, metoda nu exista;
itemsReadOnly.Remove(1); //Eroare la compilare, metoda nu exista;
itemsReadOnly[1] = 10; //Doar get se poate face;
Chiar daca incercam sa facem apoi o conversie la List, nu o sa putem, .NET ne returneaza o eroare de genul: collection is read-only.
Exemplul dat cu clasa de tip Car, poate sa rescris in forma urmatoare:
public class Car
{
internal readonly ReadOnlyCollection<Component> _components;

public Car(ReadOnlyCollection<Component> components) //sau public Car(List<Component> components)
{
_components = components; //sau _components = components.AsReadOnly();
}
}
Read More
Posted in AsReadOnly, ReadOnlyCollection | No comments

Friday, 4 March 2011

Null object pattern - design pattern

Posted on 01:04 by Unknown
Acest design pattern ar trebui sa ne ajute pentru a elimina sau cel putin sa reducem numarul de verificare de genul:
If( obj != null )
{
//Ceva cod.
}
Pentru a putea folosi acest design pattern este nevoie sa declaram o instanta a unui obiect( sau o clasa) care sa joace rolul obiectului care reprezinta valorea null. Exista doua varinte de implementare, de la caz la caz se poate folosi una din ele.
In prima varianta se foloseste o instanta a clasei care joaca rolul de valoarea NULL. Aceasta este oferita dezvoltatorului prin intermediul unei propietati statice.
public class Car
{
public static readonly Car NullObj;

static Car
{
NullObj = new Car();
//Setare valori, propietati cu valori default.
}
}
Deoarece am declarat field-ul ca fiind read-only, setarea acestuia se va putea face doar in constructor. Codul pe care o sa il folosim acuma o sa fie asemanator cu:
if( car == Car.NullObj )
{
//Executa ceva
}
In cazul in care vrem sa apelam metode sau propietati, putem le apelam fara sa facem verificarea daca obiectul este NULL sau nu. O sa putem scrie fara probleme cod de genul:
car.Color;
car.ChangeColor();
O alta varianta care se foloseste cand lucram cu clase abstracte sau cu interfete este sa ne declaram o clasa care sa reprezinte valoarea NULL. Iar aceasta clasa o sa poata fi folosita cand nu avem o instanta a clasei dorite si care poate sa aiba un comportament mai special, de exemplu sa faca o logare.
public abstract class Car
{
public static readonly Car NullObj;

static Car()
{
NullObj = new NullCar();
//Initializare custom daca este nevoie;
}

public class NullCar : Car
{
//Implementare custom pentru clasele abstracte sau virtuale.
}
}
Toate valoriile care o sa reprezinte instance NULL din clasa Car o sa fie de tip NullCar.
Acest pattern nu se poate sa fie folosit in orice caz, dar sunt cazuri cand se preteaza foarte bine. Un caz pe care l-am identificat este cand avem un API( un serviciu) care se ocupa de notificari. Mecanismul prin care se face notificati poate sa fie configurabil( SMS,MSM, email, etc) si chiar schimbat fara sa oprim aplicatia. Pot sa apara cazuri cand acest mecanism sa nu fie configurat, caz in care ar fi nevoie sa verificam inante de a apela metoda care face notificarea daca valoarea este NULL sau nu. Pentru acest caz am putea sa avem ceva de genul:
public interface INotification
{
void Notify();
}
public class NullNotification : INotification
{
public void Notify
{
//Se poate face un login.
}
}
In acest caz, daca nu avem nici un mecanism de notificare configurat, putem ca in NullNotification sa logam aceasta problema.
Read More
Posted in design patterns, null expcetion, null object pattern, NullReferenceException | No comments
Newer Posts Older Posts Home
Subscribe to: Comments (Atom)

Popular Posts

  • Service Bus Topic - Automatic forward messages from a subscription to a topic
    Windows Azure Service Bus Topic is a service that enables us to distribute the same messages to different consumers without having to know e...
  • CDN is not the only solution to improve the page speed - Reverse Caching Proxy
    I heard more and more often think like this: “If your website is to slow, you should use a CDN.” Great, CDN is THE solution for any kind of ...
  • Content Types - Level 6: Rich Media
    Level 6: Rich Media NOTE: This is part 7 of 7 and the conclusion of this continuing series; please see earlier posts for more background inf...
  • Publishing our CellCast Widget for iPad
    The rush has been on this week as our development team worked to design a new version of our CellCast Widget specifically for Apple's up...
  • Patterns in Windows Azure Service Bus - Message Splitter Pattern
    In one of my post about Service Bus Topics from Windows Azure I told you that I will write about a post that describe how we can design an a...
  • E-Learning Vendors Attempt to Morph Mobile
    The sign should read: " Don't touch! Wet Paint !" I had a good chuckle today after receiving my latest emailed copy of the eLe...
  • SQL - UNION and UNION ALL
    I think that all of us used until now UNION in a SQLstatement. Using this operator we can combine the result of 2 queries. For example we wa...
  • Cum sa salvezi un stream direct intr-un fisier
    Cred ca este a 2-a oara când întâlnesc aceasta cerința in decurs de câteva săptămâni. Se da un stream și o locație unde trebuie salvat, se c...
  • Task.Yield(...), Task.Delay(...)
    I think that a lot of person already heard about these new methods. In this post I want to clarify some things about these new methods that ...
  • Content Types - Level 4: Reference
    Level 4: Reference Materials & Static Content NOTE: This is part 5 of 7 in a continuing series; please see earlier posts for more backgr...

Categories

  • .NET
  • .NET nice to have
  • #if DEBUG
  • 15 iunie 2011
  • 15 octombrie 2011
  • 2011
  • abstracta
  • action
  • adaugare
  • ajax
  • Amsterdam
  • Android
  • aplicatii
  • App Fabric
  • Apple iSlate
  • array
  • as
  • ASP.NET
  • AsReadOnly
  • Assembly comun
  • async
  • Asynchronous programming
  • asyncron
  • Autofac
  • AutoMapper
  • az
  • Azure
  • Azure AppFabric Cache
  • Azure backup solution
  • Azure Storage Explorer
  • azure. cloud
  • backup
  • BCP utility
  • bing maps v7
  • BitArray
  • BlackBerry
  • blob
  • BlobContainerPublicAccessType
  • breakpoint
  • bucuresti
  • C#
  • cache
  • CallerMemberName
  • CellCast
  • Certificate
  • CES
  • change
  • ChannelFactory
  • clasa
  • classinitialize
  • clean code
  • click event
  • close
  • Cloud
  • Cluj
  • cluj-napoca
  • Code contracts
  • code retrat
  • codecamp
  • CollectionAssert
  • Compact Edition
  • compara
  • Comparer T .Default
  • CompareTo
  • comparison
  • comunitate
  • concurs
  • Conditional attribute
  • configurare
  • connection string
  • container
  • content type
  • control
  • Convert
  • convertAll
  • convertor
  • cross platform
  • CRUD
  • css
  • custom properties
  • custom request
  • DACPAC
  • Daniel Andres
  • data sync service
  • database
  • date time
  • datetime
  • debug
  • default
  • delegate
  • dependency injection
  • deploy
  • DeploymentItem
  • design patterns
  • Dev de Amsterdam
  • development stoage
  • dictionary
  • diferente
  • digging
  • director
  • Directory.Exist
  • disable
  • dispatcher
  • dispose
  • dropdown
  • dynamic
  • EF
  • email
  • encoding
  • entity framework
  • enum
  • enumerable
  • Environment.NewLine
  • error
  • error 404
  • error handling
  • eveniment
  • event
  • ews
  • excel
  • exception
  • exchange
  • exita
  • explicit
  • export
  • extension
  • field
  • File.Exist
  • finalize
  • fire and forget
  • Fluent interface pattern
  • format
  • func
  • GC.SuppressFinalize
  • generic
  • getdirectoryname
  • globalization
  • gmail
  • hackathon
  • Hadoop
  • handle
  • HTML
  • html 5
  • Html.ActionLink
  • http://www.blogger.com/img/blank.gif
  • HttpModule
  • IComparable
  • IE
  • ienumerable
  • IIS
  • image
  • implicit
  • import
  • int
  • internationalization
  • Internet Explorer
  • interop
  • Ioc
  • IP Filter
  • iPhone
  • iQuest
  • IStructuralEquatable
  • ITCamp
  • itspark
  • java script
  • javascript
  • July 2012
  • KeyedByTypeCollection
  • KeyNotFoundException
  • Kinect SDK
  • lambda expression
  • LightSwitch Microsoft Silverlight
  • linq
  • list
  • lista
  • lista servicii
  • liste
  • Live Connect
  • Live ID
  • load
  • localization
  • lock
  • m-learning
  • MAC
  • Mango
  • map
  • mapare
  • mapare propietati
  • messagequeue
  • meta properties
  • method
  • MethodImpl
  • Metro App
  • Microsoft
  • Microsoft Sync Framework
  • mlearning
  • mlearning devices
  • Mobile Apps
  • mobile in the cloud
  • mobile learning
  • mobile services
  • Mobile Web
  • mongoDb
  • monitorizare
  • msmq
  • multitasking
  • MVC
  • MVC 3
  • MVVM
  • namespace
  • nextpartitionkey
  • nextrowkey
  • Ninject
  • nivel acces
  • no result
  • normalize
  • nosql
  • null expcetion
  • null object pattern
  • NullReferenceException
  • OAuth API
  • office
  • offline
  • Open ID
  • openhackeu2011
  • operations
  • operator
  • optimization
  • option
  • outputcache
  • OutputCacheProvider
  • override
  • paginare
  • pagination
  • path
  • persistare
  • Portable Library tool
  • Post event – CodeCamp Cluj-Napoca
  • predicate
  • predictions
  • prezentare
  • process
  • proiect
  • property
  • propietati
  • query
  • ReadOnlyCollection
  • ReadOnlyDictionary
  • referinta
  • reflection
  • remote
  • reply command
  • request
  • request response
  • resouce
  • REST
  • REST Client
  • RESTSharp
  • ronua
  • rss
  • rulare
  • salvare in fisier
  • sc
  • schimbare timp
  • select
  • select nodes
  • send
  • serializare
  • serialization
  • Server.Transfer. Resposen.Redirect
  • service bus
  • ServiceBase
  • servicecontroller
  • sesiune
  • session
  • Session_End
  • Session_Start
  • setup
  • Sibiu
  • signalR
  • Silverlight
  • sincronizare
  • Single Responsibility Principle
  • SkyDrive
  • skype
  • smartphones
  • smtp
  • Snapguide
  • sniffer
  • socket
  • solid
  • spec#
  • sql
  • Sql Azure
  • SQL CE
  • sql server 2008 RC
  • SRP
  • startuptype
  • stateful
  • stateless
  • static
  • stergere
  • store
  • store procedure
  • stream
  • string
  • string.join
  • struct
  • StructuralEqualityComparer
  • submit
  • switch
  • Symbian
  • Synchronized
  • system
  • tabele
  • table
  • techEd 2012
  • tempdata
  • test
  • testcleanup
  • testinitialize
  • testmethod
  • thread
  • timer
  • ToLower
  • tool
  • tostring
  • Total Cost Calculator
  • trace ASP.NET
  • transcoding
  • tuplu
  • tutorial
  • TWmLearning
  • type
  • unit test
  • unittest
  • UrlParameter.Optional
  • Validate
  • validation
  • verificare
  • video
  • view
  • ViewBag
  • virtual
  • visual studio
  • VM role
  • Vunvulea Radu
  • wallpaper
  • WCF
  • WebBrower
  • WebRequest
  • where clause
  • Windows
  • windows 8
  • Windows Azure
  • Windows Azure Service Management CmdLets
  • windows live messenger
  • Windows Mobile
  • Windows Phone
  • windows service
  • windows store application
  • Windows Task
  • WinRT
  • word
  • workaround
  • XBox
  • xml
  • xmlns
  • XNA
  • xpath
  • YMesseger
  • Yonder
  • Zip

Blog Archive

  • ►  2013 (139)
    • ►  November (17)
    • ►  October (12)
    • ►  September (10)
    • ►  August (7)
    • ►  July (8)
    • ►  June (15)
    • ►  May (12)
    • ►  April (17)
    • ►  March (16)
    • ►  February (9)
    • ►  January (16)
  • ►  2012 (251)
    • ►  December (9)
    • ►  November (19)
    • ►  October (26)
    • ►  September (13)
    • ►  August (35)
    • ►  July (28)
    • ►  June (27)
    • ►  May (24)
    • ►  April (18)
    • ►  March (17)
    • ►  February (20)
    • ►  January (15)
  • ▼  2011 (127)
    • ►  December (11)
    • ►  November (20)
    • ►  October (8)
    • ►  September (8)
    • ►  August (8)
    • ►  July (10)
    • ►  June (5)
    • ►  May (8)
    • ►  April (9)
    • ▼  March (14)
      • Cum sa scriem un xPath cand avem definit si un nam...
      • Blob content type - Windows Azure
      • Nivele de acces pentru containerele din Windows Az...
      • New mLearning Authoring Tools – Wave #2
      • Cum sa facem handling la evenimente dontr-o pagina...
      • Cum sa faci deploy din Visual Studio direct in cloud
      • Cum sa controlam modul in care un serviciu windows...
      • Definirea unui mecanism de comparare a entitatiilo...
      • MVC 3 - UrlParameter.Optional
      • Enumerable.Zip
      • OutputCache in Windows Azure folosind AppFabric.Cache
      • Cum sa definesti un provider custom pentru cache
      • ReadOnlyCollection
      • Null object pattern - design pattern
    • ►  February (20)
    • ►  January (6)
  • ►  2010 (26)
    • ►  December (1)
    • ►  November (1)
    • ►  October (1)
    • ►  June (2)
    • ►  May (1)
    • ►  April (4)
    • ►  March (1)
    • ►  February (1)
    • ►  January (14)
Powered by Blogger.

About Me

Unknown
View my complete profile