Menu / szukaj

NDepend – krótka recenzja

Już jakiś czas temu napisał do mnie Patrick Smacchia i poprosił o napisanie, krótkiej recenzji jego aplikacji – NDepend. Chyba nie trzeba przedstawiać nikomu tego narzędzia – jest to kombajn do analizy naszego kodu. Możliwości jego są olbrzymie. Chcąc podejść do tej prośby profesjonalnie, postanowiłem poznać to narzędzie dość dokładnie przed napisaniem czegokolwiek. Niestety poległem. Mnogość funkcji i możliwość dostosowywania tego narzędzia powodują, że jest naprawdę ciężko. Używając go już ponad dwa miesiące mogę spokojnie napisać, że nie czuję się dość zaawansowanym użytkownikiem. Czytaj dalej

Caching w Azure Function – czyli jak podpiąć Redis’a

Pewnie już wiecie, ale tak w ramach przypomnienia… Microsoft przygotował niewielki zestaw bardzo przydatnych komponentów, które pozwalają na zintegrowanie naszej funkcji z następującymi usługami: Azure Storage, Azure Event Hubs, Azure Service Bus, Azure Mobile Apps, Azure Cosmos DB, Azure Notification Hubs, Twilio, SendGrid. Lista ta pozwala na zaspokojenie różnorakich scenariuszy. Ale jak zawsze chcielibyśmy coś więcej.

Dzisiaj chciałbym Wam pokazać jak w bardzo łatwy sposób można dodać cache do naszej funkcji. W przykładzie zostanie wykorzystany Redis. Pewnie zastanawiacie się po co? Niejednokrotnie mówiłem, że funkcje powinny być atomowe, bezstanowe, szybkie, … Rzeczywistość nie zawsze jest taka różowa. Czasami musimy coś zoptymalizować i zrobić rzecz nie do końca zgodnie z teorią. I tak było w tym przypadku. Czytaj dalej

Azure Functions – Lessons learned

Ostatnio wszystkie tematy związane z Chmurą oraz pojęciem Serverless stały się bardzo modne. Jednym z takich elementów są Azure Functions. Na stronie Microsoftu można przeczytać, że:

Azure Functions to rozwiązanie umożliwiające łatwe uruchamianie małych fragmentów kodu („funkcji”) w chmurze. Możesz napisać tylko kod rozwiązujący aktualny problem, nie martwiąc się o całą aplikację ani infrastrukturę do jej uruchomienia. Dzięki usłudze Functions programowanie może być jeszcze wydajniejsze i można korzystać z wybranego języka programowania, takiego jak C#, F#, Node.js, Python lub PHP. Płać tylko za czas działania kodu — platforma Azure jest skalowana zgodnie z potrzebami. Usługa Azure Functions pozwala tworzyć na platformie Microsoft Azure aplikacje niewymagające użycia serwera.

I rzeczywiście mógłbym pisać dużo o komforcie użycia, łatwości wdrożenia i jeszcze kilkunastu innych cechach, które urzekły mnie w tym rozwiązaniu. Super sprawdzają się w przypadku projektów, które nie potrzebują dużego backendu. Przetestowałem to rozwiązanie wielokrotnie i jestem z niego zadowolony.

Nie odbyło się jednak bez błędów, o których chciałbym wspomnieć – a dokładniej dwóch. Czytaj dalej

FluentValidation.Validators.UnitTestExtension wersja 1.1

Nowa wersja pakietu FluentValidation.Validators.UnitTestExtension jest dostępna. Pakiet umożliwia tworzenie testów jednostkowych Fluent Validator-ów w sposób bardziej efektywny.

W wersji 1.1 wprowadziłem następujące zmiany:

  • dodałem wsparcie do najnowszej wersji biblioteki FluentValidation 7.*,
  • wprowadziłem możliwość szybkiego testowania dwóch walidatorów – ScalePrecisionValidator oraz RegularExpressionValidator.

Projekt dostępny jest oczywiście na GitHubie.

Pakiet Moq.EntityFramework.Helpers

Na blogu pojawiły się ostatnio dwa wpisy pokazujące w jaki sposób mnożna zamockować DbSet<TEntity> wykorzystując Moq:

Opisane rozwiązania połączyłem w jednej bibliotece i opublikowałem jako pakiet NuGet – Moq.EntityFramework.Helpers. Czytaj dalej

EntityFramework – testowanie zapytań asynchonicznych

Jakiś czas temu opisałem w jaki sposób można zamockować typy DbContext przy pomocy MoqMockowanie typów DbContext oraz DbSet z wykorzystaniem Moq. Temat ten nie został wtedy całkowicie wyczerpany. Pozostał jeden element do opisania – zapytania asynchoroniczne. Do tego elementu chciałbym dziś wrócić.

Punktem wyjście będzie poprzedni wpis – czyli mamy fragment kodu, który pozwala na zamockowanie DbSet<T>. Teraz tylko dodamy możliwość obsługi wywołań asynchronicznych. Aby to zrobić należy zaimplementować interfejs IDbAsyncQueryProvider:

public class InMemoryAsyncQueryProvider<TEntity> : IDbAsyncQueryProvider
{
  private readonly IQueryProvider innerQueryProvider;
  
  internal InMemoryAsyncQueryProvider(IQueryProvider innerQueryProvider)
  {
    this.innerQueryProvider = innerQueryProvider;
  }

  public IQueryable CreateQuery(Expression expression)
  {
    return new InMemeoryAsyncEnumerable<TEntity>(expression);
  }

  public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
  {
    return new InMemeoryAsyncEnumerable<TElement>(expression);
  }

  public object Execute(Expression expression)
  {
    return this.innerQueryProvider.Execute(expression);
  }
  
  public TResult Execute<TResult>(Expression expression)
  {
    return this.innerQueryProvider.Execute<TResult>(expression);
  }

  public Task<object> ExecuteAsync(Expression expression, CancellationToken cancellationToken)
  {
    return Task.FromResult(Execute(expression));
  }

  public Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)
  {
    return Task.FromResult(Execute<TResult>(expression));
  }
}

Czytaj dalej

Migracja z ASP.NET Core 1.0.x do 1.1

Od 17 listopada dostępna jest nowa wersja .NET Core 1.1. Wraz z nią pojawiły się nowe wersje ASP.NET oraz EntityFrameworka. Przyszedł, więc czas na aktualizację aplikacji do najnowszego środowiska. Proces ten powinien przebiegać bezboleśnie, ale nie do końca. W moim przypadku miałem problemy z dwoma elementami, co spowodowało, że aplikacja nie wystartowała od razu po aktualizacji.

Przed przystąpieniem do aktualizacji należy ściągnąć najnowszą wersją pakietów – zarówno SDK, jak i Runtime. Pakiety do ściągnięcia dostępne są na stronie .NET Core Downloads. Czytaj dalej

.net DD 2016 – materiały

Od jakiegoś czasu dostępne są już na kanale YouTube materiały z konferencji .NET DeveloperDays 2016. Jeśli chodzi o mnie to w tym roku najlepszym prelegentem był Ted Neward. Szczególnie polecam sesję zamykającą. Nie jest to prezentacja ściśle techniczna, a raczej filozoficzna. W jej trakcie Ted pokazuje jak istotne znaczenie na ocenę sytuacji ma kontekst. Oraz jak trudno jest znaleźć najlepsze jednoznaczne rozwiązanie. Zresztą zobaczcie sami.