MiniProfiler + EF6

3/27/2014 2:14:07 AM By Felipe Pessoto

Há algum tempo tive problemas com o MiniProfiler e o Entity Framework 6, até que lançaram uma nova versão beta que suporta o EF6.

Porém o MiniProfiler continuava usando o método antigo de interceptação que criava uma wrapper nos providers, conexões, comandos, etc. Que não é mais necessário, além de estar no limite da gambiarra.

Além disso tinha um grande problema, não funcionava com outras ferramentas que também usavam o método antigo, por exemplo o EFProf.

Criei um tópico no forum de suporte e acabei desenvolvendo uma nova implementação do MiniProfiler.EF6, dessa vez usando um Interceptor, evitando gambiarras e com o código muito mais simples, além de agora também mostrar o valor e informaçoes sobre os parametros das queries. E agora funciona com o EFProf.

 

 

Seguem os links das discussões e o pull request no GitHub:

http://community.miniprofiler.com/t/miniprofiler-efprof-doesnt-work/239

http://community.miniprofiler.com/t/will-mini-profiler-support-ef6/19/9

https://github.com/MiniProfiler/dotnet/pull/44

A diferença que o C# 5.0 faz com o async/await

3/11/2013 11:51:00 PM By Felipe Pessoto

A melhor forma de ver a grande diferença que o async faz é usando exemplos. Saindo de um código não só maior, mas muito mais complicado, com callbacks, tratamento de contexto e thread de execução, tratamento de erros aninhados com os callbacks, pra um código simples, como se fosse um código síncrono comum.

Código Antigo:

void ShowStuff ()
{
	var client = new WebClient ();
	var content = JsonValue.Parse (client.DownloadString ("http://api.worldbank.org/countries?format=json&per_page=50"));
	int number_of_countries = content [0] ["total"];
	int done = 0, error = 0;

	InvokeOnMainThread (() => {
		CountriesLabel.Text = string.Format ("Countries: {0} done: 0 error: 0", number_of_countries);
	});

	foreach (JsonObject c in content [1]) {
		string country_url = string.Format ("http://api.worldbank.org/countries/{0}/indicators/NY.GDP.MKTP.CD&format=json", (string)c ["id"]);
		JsonValue json = null;

		try {
			json = JsonValue.Parse (client.DownloadString (country_url));
		} catch (Exception e){
			++error;
			InvokeOnMainThread (()=> status.Text = "Got exception "+ e);
			continue;
		}

		ThreadPool.QueueUserWorkItem (delegate {
			Map map = null;
			try {
				map = LoadCountryLogo (c ["name"]).Result;
			} catch (Exception e){
				++error;
				InvokeOnMainThread (()=> status.Text = "Got exception "+ e);
			}
			if (map != null){
				ThreadPool.QueueUserWorkItem (delegate {
					Position position = null;

					try {
						position = LookupCountryPosition (c ["longitude"], c ["latitude"]).Result;
						if (position != null)
							InvokeOnMainThread (() => {
								AddPin (map, position); 
								++done;
								status.Text = json ["name"];

							});
					} catch (Exception e){
						error++;
						InvokeOnMainThread (()=> status.Text = "Got exception "+ e);
					}

				});
			}
		});
		
		InvokeOnMainThread (() => CountriesLabel.Text = string.Format ("Countries: {0} done: {1} error: {2}", number_of_countries, done, error));
	}
	InvokeOnMainThread (() => {
		CountriesLabel.Text = string.Format ("Countries: {0}", number_of_countries);
	});
}
 

Código usando C# 5.0:

async Task ShowStuffAsync ()
{
	var client = new HttpClient ();

	var content = JsonValue.Parse (await client.GetStringAsync ("http://api.worldbank.org/countries?format=json"));
	int number_of_countries = content [0] ["per_page"];
	int done = 0, error = 0;

	CountriesLabel.Text = string.Format ("Countries: {0} done: 0 error: 0", number_of_countries);

	foreach (JsonObject c in content [1]) {
		try {
			string country_url = string.Format ("http://api.worldbank.org/countries/{0}/indicators/NY.GDP.MKTP.CD&format=json", (string)c ["id"]);
			var json = JsonValue.Parse (await client.GetStringAsync (country_url));
			var map = await LoadCountryLogoAsync (json ["name"]);
			if (map != null){
				var position = await LookupCountryPositionAsync (c ["longitude"], c ["latitude"]);
				if (position != null){
					AddPin (map, position);
					status.Text = json ["name"];
					++done;
				}
			}

		} catch (Exception e) {
			++error;
			status.Text = "Got exception "+ e;
		}
		CountriesLabel.Text = string.Format ("Countries: {0} done: {1} error: {2}", number_of_countries, done, error);
	}
	CountriesLabel.Text = string.Format ("Countries: {0}", number_of_countries);
}
 

Entrevista com Eric Lippert

6/24/2012 10:40:38 PM By Felipe Pessoto

Rachel Roumeliotis, editora da O´Reilly, entrevistou Eric Lippert sobre assuntos como async do novo C#5.0, o projeto Roslyn e o mais interessante, o que o Eric imagina pro futuro do C#. Apenas de ser uma opinião pessoal e hipotética, ele costuma postar no blog dele sobre assuntos hipotéticos e que meses depois acabamos vendo no C#.

Os pontos principais da entrevista são: 

  • Async como principal novidade do C# 5.0. [3:32]
  • O projeto Roslyn que facilitará a criação de ferramentas que interpretam C# e VB.NET. [6:37]
  • O que "pode" estar vindo no futuro do C#. [11:55]

Entrevista com Anders Hejlsberg

1/24/2012 9:51:36 AM By Felipe Pessoto

Tim Huckaby entrevista Anders Hejlsberg, conhecido como "pai" do C#, eles conversam sobre o futuro do C#, que está sempre em evolução e os últimos projeto que Anders está envolvido.

Anders esclarece que o C# e VB.NET não foram deixados de lado nas Apps Metro do Windows 8 e junto com o C++ e JavaScript serão todos de primeira importância. Eles também falam sobre Async que virá no C# 5.0 e o projeto Roslyn, o compilador de C# escrito em C# com API´s para consumo por ferramentas de terceiros.

Video Downloads
WMV (Zip) | WMV | iPod | MP4 | 3GP | Zune | PSP

Audio Downloads
AAC | WMA | MP3 | MP4