Szybki sposób na Dependency Injection w ASP.NET WebAPI

Konfiguracja pakietu DI, takiego jak Ninject zawsze kojarzyła mi się z wieloma problemami, żmudną konfiguracją i tworzeniem DependencyResolvera. Tak było dopóki nie odkryłem wspaniałej paczki nugetowej, która załatwia wszystko za developera. Wystarczy zainstalować paczkę Ninject.WebApi.DependencyResolver.

Install-Package Ninject.WebApi.DependencyResolver

Paczka ta dociągnie wszystkie zależności w tym paczki Ninject-owe. Przed odpaleniem projektu należy jeszcze otworzyć plik: App_Start/NinjectWebCommon.cs i w metodzie CreateKernel(), tuż przed return dodać wpis:

System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new Ninject.WebApi.DependencyResolver.NinjectDependencyResolver(kernel);

Zastanawiacie się co dalej? To wszystko, możecie już korzystać z wstrzykiwania zależności, poprzez konstruktor bądź poprzez atrybut Inject. Więcej o bibliotece Ninject znajdziecie tutaj.

TIP: Nie wiem czemu, ale ja po instalacji jeszcze błąd, że nie można znaleźć biblioteki Ninject.dll w wersji 3.2.0.0. Spojrzałem i rzeczywiście zainstalowała się wersja 3.0.0.0. Dlatego musiałem jeszcze zaktualizować tą bibliotekę:

Update-Package Ninject

Po tym już wszystko działało poprawnie.

Internet mobilny z Play na OS X El Capitan

Ostatnio zmagałem się z konfiguracją internetu mobilnego w play. Trochę nad tym posiedziałem, więc chciałbym opisać rozwiązanie problemu, który może przytrafi się też komuś innemu. Otóż zakupiłem w salonie play model Huawei E3372h wraz ze starterem. Niestety nie doczytałem, że model ten wspiera systemy Mac OS X w wersji: 10.7, 10.8 i 10.9. Aplikacja play dołączona do modemu nie potrafiła sobie poradzić z El Capitan (10.11) i wyrzucała błąd:

The installer could not install the software because there was no software found to install. 

play_installation_failed

Przeczytałem kilka wpisów i nic nie pomagało, dopiero po jakimś czasie wpadłem na genialny pomysł aby wejść na stronę Huawei i sprawdzić sterowniki do tego modemu. Strona nie jest zbyt intuicyjna, ale udało się odnaleźć odpowiednią zakładkę. Po wejściu kilkamy link Update i dostajemy firmawre dla wszystkich wspieranych systemów. W moim przypadku pobrałem plik Stick Mobile Partner(for MAC10.11). Po instalacji tego programu, podpinamy nasz modem i program sam powinien wykryć konfiguracje i pozwolić na połączenie do internetu.

Fixing linq typings to work with es6

I’m sure that everyone knows linq. There is library which is very useful and has version not only in C# but also in JavaScript. Using linq in javascript may be confusing few years ago but now it’s common problem that we need do some operations on lists in js. I worked on few projects where i used Linq in javascript but lately i wanted to use it in Aurelia which is using es6 (ecmascript 6). First i had a problem how to use npm library in Aurelia which use jspm. I asked about that in stackoverflow and get the answer. But then i started using typescript and everything f**ed up.

First i need typings for linq, so i googled linq.d.ts and get first answer. I added this to my project and created first typescript class. What happened? Visual studio shows error that cannot find module ‚linq’.

I thought that this is something with npm package. But when i wrote the same import in javascript it worked fine. So i checked linq.d.ts file and tried to changed it to meet the import statement. I didn’t changed any interfaces to be sure that i will have correct typings, but what i changed was module declaration. Original module declaration was:

declare module linq

I changed that to:

declare module 'linq'

Error about module disappear but i got another error.

So i had to move Enumerable variable into module declaration and make this variable default export.

declare module 'linq' {
    
    //Interfaces...

    var Enumerable: EnumerableStatic;
    export default Enumerable;
}

That helped, there is no error anymore. It should work for most of you, but because of my clumsiness i didn’t noticed that linq in some version changed their functions names. In some older version it was UpperCamelCase (with first letter is capital ex. SingleOrDefault()) and now it is the same as all javascript functions so lowerCamelCase (ex. singleOrDefault()). So again i had to change my typings. I found the newest one at linqjs codeplex page. Did the same changes (with module name and default export) again and now i can use linq in typescript with ecmascript 6 features.

If anyone interested here you can download linq.d.ts file.

Windows Store Apps – Typescript

Dzisiaj chciałbym przedstawić swój pierwszy videotutorial, w którym kontynuuje tematykę Windows Store Apps pisanych w HTML5 i JavaScript. Myślałem już jakiś czas temu, aby zamiast pisania artykułów nakręcić film, na którym można dużo więcej pokazać i w końcu mi się udało. Myślę, że jest to lepsza forma przekazywania wiedzy i liczba błędów, które można popełnić odtwarzając kroki jest również o wiele mniejsza. Zachęcam do obejrzenia i komentowania 🙂

Kod źródłowy projektu po modyfikacji znajdziecie tutaj.

MVVM dla aplikacji Windows Store pisanych w JavaScript

Sporo się mówi/pisze o zastosowaniu wzorca MVVM w aplikacjach Windows Store i Windows Phone (teraz to chyba jest pod jedną nazwą ;)). Istnieje kilka bibliotek, jak na przykład MVVMLight, które pomagają w implementacji tego wzorca w XAML-u i C#. Niewiele się jednak mówi o aplikacjach Windows Store pisanych w języku JavaScript. Wydaje mi się, że niewiele osób kiedykolwiek próbowało stworzyć aplikacje dla Windows Phone w tym języku. W zasadzie to się nie dziwię, JavaScript to dziwny język i można go kochać lub nienawidzić. Niemniej jednak chciałbym pokazać, że pisanie aplikacji Windows Store w JS nie jest takie złe a w tym poście przede wszystkim chciałbym pokazać, że zastosowanie wzorca MVVM jest możliwe i jest bardzo proste.

1. Zacznijmy od stworzenia nowego projektu, polecam przy tworzeniu wybrać Navigation App, ponieważ stworzy nam się prawie pusta aplikacja, ale ze wszystkimi potrzebnymi rzeczami. Jeśli zaczęlibyśmy od Blank App, musielibyśmy posiedzieć jeszcze trochę nad poukładaniem stron, tak, aby można było zacząć programować.

winjs1

2. Język XAML jest wręcz stworzony do stosowania wzorca MVVM, wbudowany w ten język mechanizm bindingu pozwala nam stosować MVVM bez potrzeby dodawania jakiekolwiek zewnętrznej biblioteki. HTML niestety nie jest taki wspaniały, dlatego musimy wesprzeć się dodatkową biblioteką. Istnieje kilka bibliotek, których możemy użyć, ja natomiast najpewniej czuje się z biblioteką knokcoutjs, dlatego to w niej pokażę przykład. Bibliotekę tą możemy dodać za pomocą Nugeta, wyszukujemy knockoutjs i klikamy Install. Po tej operacji w katalogu Scripts powinny się nam pojawić dwa pliki knockout-{nr.wersji}.js i knockout-{nr.wersji}.debug.js.

winjs2

 

3. Otwieramy plik default.html i dodajemy link do pliku knockout-x.x.x.js, najlepiej przeciągając plik z solution explorera, w odpowiednie miejsce w dokumencie, ewentualnie wpisując ręcznie:

 <script src="Scripts/knockout-3.2.0.js"></script>

4. Tworzymy sobie nowy katalog o nazwie viewmodels. W tym katalogu będziemy przechowywać nasze klasy ViewModel. Dodajemy pierwszy plik js o nazwie MainViewModel.js. W środku, zaimplementujemy bardzo prostą logikę, wraz z dwoma polami do odczytu oraz metodą wywołującą MessageBox.

var MainViewModel = function (firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;

    this.sayHello = function () {
        var msg = new Windows.UI.Popups.MessageDialog("Hi! my name is " + this.firstName + " " + this.lastName);
        msg.showAsync();
    }
}

5. Przechodzimy do pliku home.html, i w miejsce „Content goes here” wklejamy prosty binding imienia i nazwiska oraz binding funkcji sayHello.

Imie:  
Nazwisko:

6. Zostajemy jeszcze w tym samym pliku i w znaczniku head, dodajemy odwołanie do naszego skryptu z MainViewModel, tak samo jak w punkcie 3 przeciągając plik MainViewModel.js w odpowiednie miejsce.
7. Zostaje nam na sam koniec tylko stworzyć obiekt viewmodel i podbindować pod odpowiedni widok. Otwieramy więc plik home.js i w funkcji ready dodajemy dwie linijki:

var vm = new MainViewModel("Jan", "Kowalski");
ko.applyBindings(vm);

8. Efekt, jaki powinniśmy dostać to aplikacja wyświetlająca Jan Kowalski oraz przycisk, po naciśnięciu którego powinien pojawić się MessageBox.

winjs3

 

Jeśli ktoś wcześniej nie miał do czynienia z biblioteką Knockoutjs, to polecam stronę http://knockoutjs.com/ na której znajdziecie tutorial, dzięki któremu w bardzo szybki sposób można nauczyć się podstaw tej biblioteki. Oczywiście można tutaj stosować TwoWay binding, oraz wiele innych ciekawych rzeczy, które odkryjecie na pewno przechodząc tutorial.

Kod źródłowy do pobrania

Interceptor dla WCF-a

Ostatnio programując w javie (sic!) spodobała mi się jedna rzecz, którą chciałem wprowadzić do swoich projektów w .NET, a mianowicie Interceptor. Pozwala on w prosty sposób udekorować metodę własną logiką i to wszystko za pomocą jednej adnotacji. Podobną funkcję spełniają ActionFilter w ASP.NET MVC. Ja natomiast chciałem dodać warstwę logowania do metod WCF-a, więc zacząłem szukać. Niestety nie znalazłem nic co działałoby równie dobrze co Javowe interceptory, więc postanowiłem napisać coś samemu.

Przede wszystkim chciałem aby taki interceptor można było zakładać właśnie za pomocą atrybutu (albo na pojedynczą operację albo na cały serwis). Rezultatem mojej twórczości została taka oto klasa.

public class WCFInterceptor : Attribute, IOperationBehavior, IServiceBehavior
{
    private Type actionType;

    public WCFInterceptor(Type actionType)
    {
        if (actionType == null)
            throw new ArgumentException("Type cannot be null");

        if (!actionType.GetInterfaces().Contains(typeof(IParameterInspector)))
            throw new ArgumentException("Type must implement IParameterInspector");

        this.actionType = actionType;
    }

    #region IOperationBehavior Members

    //...

    void IOperationBehavior.ApplyDispatchBehavior(OperationDescription operationDescription, 
        DispatchOperation dispatchOperation)
    {
        try
        {
            IParameterInspector actionInstance = (IParameterInspector)Activator.CreateInstance(this.actionType);
            dispatchOperation.ParameterInspectors.Add(actionInstance);
        }
        catch
        {
            throw new ArgumentException(string.Format("Could not create instance of type: {0}", this.actionType.Name));
        }
    }

    #endregion

    #region IServiceBehavior Members

    // ... 

    void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (ServiceEndpoint endpoint in serviceDescription.Endpoints)
        {
            foreach (var operation in endpoint.Contract.Operations)
            {
                operation.Behaviors.Add(this);
            }
        }
    }

    #endregion
}

Jako parametr w konstruktorze przyjmuje on typ klasy, która musi implementować IParameterInspector, jest to prosty interfejs, który wymaga zaimplementowania dwóch metod: AfterCall oraz BeforeCall. Główną przyczyną, dla której chciałem stworzyć taki interceptor było logowanie wejścia i wyjścia z operacji, dlatego dodatkowo stworzyłem klasę LogInterceptorAction, która może zostać przesłana w konstruktorze atrybutu.

public class LogInterceptorAction : IParameterInspector
{
    private readonly ILog log = LogManager.GetLogger(typeof(LogInterceptorAction));

    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
    {
        log.Debug(string.Format("EXIT {0} returns {1}", GetMethodnameWithParameters(operationName, outputs), returnValue));
    }

    public object BeforeCall(string operationName, object[] inputs)
    {
        log.Debug(string.Format("ENTER {0}", GetMethodnameWithParameters(operationName, inputs)));
        return null;
    }

    private string GetMethodnameWithParameters(string operationName, object[] outputs)
    {
        var sBuilder = new StringBuilder();
        sBuilder.Append(operationName).Append("(");
        if (outputs != null)
        {
            sBuilder.Append(string.Join(",", outputs));
        }
        sBuilder.Append(")");

        return sBuilder.ToString();
    }
}

Aby udekorować nasz serwis takim interceptorem wystarczy obok atrybutu OperationContract lub ServiceContract, dodać nasz własny WCFInterceptor

[ServiceContract]
[WCFInterceptor(typeof(LogInterceptorAction))]
public interface IService1
{
    //...
}

lub jeśli chcemy zastosować to tylko do jednej operacji

[OperationContract]
[WCFInterceptor(typeof(LogInterceptorAction))]
string GetData(int value);

Zaimplementowane podejście trochę różni się od tego co jest w javie, przede wszystkim nie mamy tutaj podejścia jak z metody szablonowej, gdzie możemy wykonać operacje WCF-a w dowolnym momencie. Możliwe, że rozwiązanie mojego problemu już istnieje i niepotrzebnie wymyślałem koło od nowa, tak więc jeśli znacie jakąś klasę/bibliotekę, która mogłaby się przydać w przyszłości, dajcie znać w komentarzach. 🙂

Splash screen with shadow

Zawsze chciałem coś takiego zrobić, a do tej pory nie wiedziałem że jest to możliwe. Efekt możecie zobaczyć poniżej, a do zrobienia takiego splash screena użyłem tylko tego co daje nam podstawowy WPF. W zasadzie bazując na tym rozwiązaniu można tworzyć aplikacje, rzucające cień na pulpit (czego bardzo mi brakuje w Windows 8).

 splashscreen

Sam efekt jest bardzo prosty do osiągnięcia i wszystko można zapisać w XAMLu.

<Window x:Class="SplashScreenApp.SplashScreen"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="350" Width="225" 
        WindowStyle="None" 
        AllowsTransparency="True" 
        Background="Transparent"
        WindowStartupLocation="CenterScreen"
        ShowInTaskbar="False">
    <Grid Background="Transparent">
        <Grid Margin="15" Background="#252526">
            <Grid.BitmapEffect>
                <DropShadowBitmapEffect Direction="-90" Softness="15" ShadowDepth="1" />
            </Grid.BitmapEffect>
            <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
                <TextBlock Text="My App" Foreground="White" FontSize="30"  />
                <TextBlock Text="v.1.0" Foreground="White" FontSize="10"  />
            </StackPanel>
        </Grid>
    </Grid>
</Window>

To co tutaj najważniejsze to:

WindowStyle=”None” – usuwa ramki z okna
AllowsTransparency=”True” – pozwala na przezroczystość wewnątrz okna
WindowStartupLocation=”CenterScreen” – ustawiamy pozycje startową okna na środek ekranu
ShowInTaskbar=”False” – chowamy okno z taskbara

No i najważniejsze czyli tworzymy grida wewnątrz grida, dając lekki margines dla wewnętrznego elementu i dla niego też tworząc DropShadowBitmapEffect. Oszukujemy więc trochę bo nasze okno jest takie duże jak okno wraz z cieniem, ale całość wyszła bardzo ładnie :)

Ewolucja Windows Phone

Od kilku dni mam przyjemność bawić się najnowszą aktualizacją Microsoftu na systemy mobilne, czyli wp_ss_20140522_0001-180x300Windows Phone 8.1. Muszę powiedzieć, że to dla mnie ogromny przeskok, ponieważ nie miałem okazji użytkować, na co dzień poprzedniej wersji (8.0). Przesiadka z 7.8 na 8.1 robi na prawdę ogromne wrażenie. Na pierwszy rzut oka widać podobieństwa do Windows 8.1, o których trochę później.
Na początek zmiana, która najbardziej rzuca się w oczy, czyli dodatkowa kolumna na swoje kafelki. Dzięki temu odblokowując telefon widzimy o wiele więcej informacji niż we wcześniejszych wersjach. Muszę przyznać, że na początku najmniejsze kafelki wydawały mi się zbyt małe i ciężko jest czasami w nie trafić, ale po pewnym czasie można się przyzwyczaić i już tak nie przeszkadza. Nie polecam ustawiać tych małych kafelków w prawym górnym rogu, bo czasami trudno tam sięgnąć ;) Ciekaw jestem tylko jak będzie wyglądać to na telefonach z mniejszym ekranem, czy tam miniaturowe kafelki zdadzą egzamin.
Następnym ukłonem w stronę użytkowników, jest centrum powiadomień, o które wiele osób się upominało. Centrum powiadomień zbiera wszystkie notyfikacje, które wcześniej były pokazywane w formie toastów. Dodatkowym plusem jest możliwość ustawienia sobie 4 skrótów, do najczęściej wykonywanych akcji. Na chwile obecną mamy 11 akcji, niestety zewnętrzne aplikacje nie mogą się podpiąć pod te skróty, więc niestety zostanie to w miarę ułomne.

wp_ss_20140522_0005-300x213Jeśli chodzi o same aplikacje to dostajemy całą paletę aplikacji, dostępnych już na Windows 8.1, takich jak PDF Reader, Finanse, Wiadomości, Pogoda itp. wydaje mi się jednak, że były one już dostępne w Windows Phone 8, więc nie będę się zbytnio o nich rozpisywał. Nowinką, na którą wszyscy czekali jest za to Cortana, która jak sama o sobie mówi jest naszym prywatnym asystentem, który stara się ułatwić nam pracę z telefonem.

wp_ss_20140522_0007-300x103Czy tak jest na prawdę? Mam podzielone zdanie, przede wszystkim muszę wspomnieć że Cortana jest jeszcze w fazie beta, więc rozumiem, że wiele rzeczy jeszcze programiści w Microsoft ją nauczą. Na razie poza rzeczami pokazanymi na konferencji build ciężko znaleźć chwile, żeby Cortana nas zaskoczyła. Większość zapytań wrzuca do binga i wyszukuje. Natomiast świetnie radzi sobie ze wszelkiego rodzaju datami i przypomnieniami. Świetną rzeczą jest możliwość przypomnienia o czymś następnym razem, gdy będziemy rozmawiać z daną osobą. Widać również, że Microsoft nauczył się w końcu, że wielka potęga drzemie w programistach i dał możliwość integracji własnych aplikacji z Cortaną.

Jeśli chodzi o sam wygląda aplikacji, to też został trochę zmieniony. Znaną już wszystkim Panoramę, zastąpił Hub, który jest w zasadzie tym samym, tylko inaczej wystylizowanym i pozwalającym na pokazanie większej ilości contentu. Poniżej stara panorama z lewej i nowa kontrolka z prawej.

wp_ss_20140522_0004-180x300wp_ss_20140522_0008-180x300

To tyle, jeśli chodzi o stronę użytkową nowego systemu, jeśli chodzi o stronę programistyczną to zmian jest o wiele więcej i
sam jeszcze nie znam wszystkich. Dopiero zaczynam oglądać nowości na różnych prezentacjach i samplach. Jak to zwykle przy nowych produktach Microsoft nakręcił już Building Apps for Windows Phone 8.1 Jump Start, czyli kurs online przedstawiający tworzenie aplikacji na Windows Phone 8.1 praktycznie od podstaw. Można go już oglądać na Channel 9.

Podsumowując moje kilkudniowe przygody z Windows Phone 8.1. Cieszę się, że Microsoft przestał robić rewolucje w swoich systemach a zaczął proces ewolucji. Dzięki temu miejmy nadzieję czekają nas dojrzałe systemy Windows 9 i Windows Phone 9.

IAESTE CaseWeek 2014

Caseweek to ogólnopolska inicjatywa studentów ze stowarzyszenia IAESTE. W tym roku po raz pierwszy inicjatywa ta zawitała również do Łodzi. Jako przedstawiciel firmy Cybercom miałem możliwość poprowadzenia warsztatów z tworzenia aplikacji Modern UI. Poniżej znajduje się prezentacja, kody źródłowe poszczególnych kroków można pobrać tutaj.

Wkrótce postaram się dodać, krótki opis poszczególnych kroków, chociaż większość rzeczy napisałem już na blogu.