BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

TechEd North America 2011 + atostogos

Parašė Sergejus | 2011-05-14 23:21

TechEd NorthAmerica Jau šį pirmadienį prasideda konferencija TechEd North America, kurioje pirmą kartą dalyvausiu ir aš. Po konferencijos dar dvi savaites keliausiu po JAV (Florida, Nevada, Kalifornija), tad šiuo laikotarpiu mano aktyvumas tinklaraštyje gali sumažėti. Kaip ir visada, konferencijos metu planuoju aktyviai dalintis naujienomis twitteryje (@sergejusb).

Rodyk draugams

Mano skaidrės iš Agile Diena konferencijos

Parašė Sergejus | 2011-05-12 10:14

Talpinu savo skaidres iš pristaymo “Kaip Agile skatina gerųjų praktikų panaudojimą”, kurį dariau Agile Diena konferencijos metu.

Rodyk draugams

Dapper .NET - Micro ORM karkasas iš StackOverflow

Parašė Sergejus | 2011-05-09 22:05

Taip, būtent! Visiems gerai žinomas StackOverflow sukūrė ir kaip atviro kodo projektą išleido savo Micro ORM karkasą Dapper .NET. Tai yra maža (vieno failo), greita (tik keliomis milisekundėmis lėtesnė nei SqlDataReader), užklausų materializavimo ir SQL komandų vykdymo biblioteka. Tarkime, turime tokį modelį:

class Question
{
    public int Id { get; set; }
    public int No { get; set; }
    public string Label { get; set; }
    public int SurveyId { get; set; }
    public Survey Survey { get; set; }
}

class Survey
{
    public int Id { get; set; }
    public string Code { get; set; }
    public string Title { get; set; }
    public DateTime Date { get; set; }
}

Žemiau pateiksiu kelias užklausas, kurios geriausiai pavaizduoja Dapper .NET galimybes:

  • materializavimą į tipizuotus objektus;
  • materializavimą į dinaminius objektus;
  • kelių objektų materializavimą;
  • SQL komandų vykdymą.
class Program
{
    static void Main()
    {
        var connectionString = ConfigurationManager.ConnectionStrings["Questions"].ConnectionString;
        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();

            var sql = "select * from Questions";
            var questions = connection.Query<Question>(sql);

            sql = "select No, Label from Questions";
            var custom = connection.Query(sql);

            sql = "select q.*, s.* from Questions q inner join Surveys s on q.SurveyId = s.Id where q.Id = @Id";
            var question1WithSurvey = connection.Query<Question, Survey>(
                sql, (q, s) => q.Survey = s, new { Id = 1 }).First();

            sql = "DBCC FREEPROCCACHE; DBCC DROPCLEANBUFFERS";
            connection.Execute(sql);
        }
    }
}

Paprasčiausias būdas išbandyti Dapper .NET – tiesiai iš NuGet (Install-Package Dapper). Turiu pripažinti, atrodo visai įdomiai, nors funkcionalumo prasme orientuota daugiausiai tik į SELECT tipo operacijas. Pasižiūrėsime kaip vystysis šis projektas ateityje.

Rodyk draugams

Paprasta JSON-RPC .NET biblioteka

Parašė Sergejus | 2011-05-02 21:10

JSON (JavaScript Object Notation) – vienas populiariausių duomenų formatų Internete. Daugelis pripratę naudoti JSON iš JavaScript ir Web aplikacijų, bet mažai kas žino, kad jis gali būti sėkmingai naudojamas ir serverio aplikacijose. Prieš kelias dienas teko daryti integraciją su viena serverių būsenos stebėjimo programine įranga. Tradiciškai, tokio tipo integracijos yra daromos per specifines bibliotekas (.NET, Java, COM), bet šis produktas (beje didelė pagarba kūrėjams), naudojo JSON-RPC protokolą. Kas nustebino, šio protokolo paprastumas – užtenka suformuoti paprastą JSON objektą su metodo pavadinimu ir argumentais bei padaryti HTTP POST.

Pavyzdinio metodo user.get iškvietimas (params gali būti sudėtingas JSON objektas):

{"jsonrpc": "2.0", "method": "user.get", "params": {"filter": { "userid": 42 } }, "id": 1}

Rezultato grąžinimas (result gali būti sudėtingas JSON objektas):

{"jsonrpc": "2.0", "result": { "userid": 42, "firstname": "Sergejus" }, "id": 1}

Klaidos grąžinimas (error objekto struktūra fiksuota):

{"jsonrpc": "2.0", "error": {"code": -12345, "message": "User not found."}, "id": 1}

Atkreipsiu dėmesį į tai, kad id – tai sekos numeris. Su kiekviena užklausa numeris tik didėja.

Pirma ką padariau, išnagrinėjau egzistuojančias .NET bibliotekas darbui su JSON-RPC. Pasirodo, egzistuoja tik viena - Jayrock. Ji turi integraciją su ASP.NET ir šiaip atrodo pakankamai solidžiai. Vienintelis dalykas kuris man kiek nepatiko, ji nesinaudoja anoniminių objektų bei dinaminių objektų galimybėmis, kas leistų gerokai supaprastinti kodą tiek skaitomumo, tiek aiškumo prasme. Kadangi integracijai man reikėjo labai minimalaus funkcionalumo, nusprendžiau greitai pasirašyti savo JSON-RPC biblioteką, paremta puikia, vieno failo biblioteka – DynamicJson. Jos pagalba JSON objektus galima konvertuoti į dinaminius C# objektus ir atvirkščiai. Ilgai negalvojęs, pasirašiau tokią JsonRpc klasę:

public class JsonRpc
{
    private int _id;

    public JsonRpc(string apiUrl)
    {
        ApiUrl = apiUrl;
    }

    public string ApiUrl { get; private set; }

    public dynamic Call(string method, object param)
    {
        var call = new
        {
            jsonrpc = "2.0",
            id = _id++,
            method = method,
            @params = param
        };

        var json = PostAndGetResponse(DynamicJson.Serialize(call));
        return DynamicJson.Parse(json);
    }

    private string PostAndGetResponse(string data)
    {
        var bytes = Encoding.UTF8.GetBytes(data);
        var wb = (HttpWebRequest)WebRequest.Create(ApiUrl);
        wb.Credentials = CredentialCache.DefaultCredentials;
        wb.ContentType = @"application/json-rpc";
        wb.Method = WebRequestMethods.Http.Post;
        wb.ContentLength = bytes.Length;

        using (var stream = wb.GetRequestStream())
        {
            stream.Write(bytes, 0, bytes.Length);
        }

        string result;
        using (var response = wb.GetResponse().GetResponseStream())
        using (var reader = new StreamReader(response))
        {
            result = reader.ReadToEnd();
        }

        return result;
    }
}

Šios klasės pagalba, darbas su JSON-RPC yra ypatingai paprastas, pvz.:

public static void Main(string[] args)
{
    var rpc = new JsonRpc("http://server/api_jsonrpc.php");
    var json = rpc.Call("user.get", new { filter = new { userid = 42 } });

    if (json.result())
    {
        var user = json.result;
    }
    else
    {
        var message = json.error.message;
    }
}

Taigi taip paprastai ir patogiai šiais laikais įmanoma integruoti aplikacijas, jeigu tik pasirinktas teisingas protokolas!

Rodyk draugams