27 czerwca 2011, 23:45 dario Komentarze (6)

VS2010 zjada mi procesor :(

Nie wiem dlaczego Microsoft nie reaguje na problemy wydajności VS2010. Odnoszę wrażenie jakby ludzie odbijali się od ściany. Sam niestety boleśnie to odczuwam. W dobrych polotach 20 do 30 minut spokojnej pracy po czym studio zaczyna zjadać mi procesor.

Jedyny ratunek to restart studia i znów kilkanaście minut spokojnej pracy :(

Niestety projekt, który piszę korzysta z Framework 4.0, więc jestem skazany. Nie próbowałem jeszcze wersji Express. Może tu będzie inaczej. :/

Mam dosyć :(

Tagi:

.Net

3 marca 2011, 12:44 dario Komentarze (2)

Fasada dla kontenera

Od dłuższego czasu we wszystkich swoich aplikacjach używam własnego frameworka, który w szybki sposób daje mi podstawowe funkcjonalności bez potrzeby pisania ich na nowo za każdym nowym projektem. Ma to bardzo dużą zaletę jeśli tyczy się szybkości tworzenia aplikacji. Napisałem go sam, więc posługiwanie się nim jest dla mnie proste, bo znam go na wylot. Jak coś jest nie tak, otwieram źródła i poprawiam. Jak czegoś brakuje, a widzę, że w wielu aplikacjach pisałem podobnym kod to go tam umieszczam. Funkcjonalności, które są tam umieszczone nie są ze sobą powiązane, bo wszędzie jak tylko się da używam kontenera do rozwiązywania zależności, a dzieje się to już tylko w ostatecznej aplikacji.

Niestety wiązało się to z referencją do biblioteki kontenera. W moim przypadku jest to StructureMap, który stale się rozwija a wersje dosyć często zmieniają. Dodatkowym problemem staje się użycie NServiceBus wraz z builderem StructureMap. Wtedy już horror, bo co nowsza wersja NServiceBus to i inna wersja StructureMap użyta. Wszystkie referencje trzeba poprawiać, itd, itp. A najgorsze jest to, że dotyka to także mojego projektu bazowego, czyli frejmworka.

Nie chcę go za każdym razem zmieniać jak tylko StructureMap pojawi się w nowszej wersji, więc zrobiłem fasadę. Jest to chyba jedyna praktyczna przyczyna wykonania fasady dla kontenera. Wszak kontener jest dosyć bazowym elementem w aplikacji i nie zmienia się go od tak.

Kod fasady wygląda nastepująco:

public sealed class IoC
{
    private static IoCResolver Resolver { get; set; }

    public static void RegisterResolver(IoCResolver resolver)
    {
        Resolver = resolver;
    }

    public static IList GetAllInstances()
    {
        return Resolver.GetAllInstances();
    }


    public static T TryGetInstance()
    {
        return Resolver.TryGetInstance();
    }

    public static object TryGetInstance(System.Type type)
    {
        return Resolver.TryGetInstance(type);
    }

    public static T GetInstance()
    {
        return Resolver.GetInstance();
    }

    public static object GetInstance(System.Type type)
    {
        return Resolver.GetInstance(type);
    }
}

Jak zapewne niektórzy zauważyli metody mają te same nazewnictwo co metody w StructureMap. Przyzwyczaiłem się, więc po co kombinować. :)

No to teraz co to jest IResolver. Jest to interfejs pod którym w docelowym projekcie aplikacji kryje się konkretna implementacja dla danego kontenera. Interfejs jest w sumie prosty:

public interface IoCResolver
{
    IList GetAllInstances();
    
    T TryGetInstance();
    object TryGetInstance(System.Type type);

    T GetInstance();
    object GetInstance(System.Type type);
}

Te kilka metod pozwala w pełni na posługiwanie się kontenerem. Teraz może przykładowa implementacja dla StructureMap:

public class StructureMapResolver : IoCResolver
{
    public System.Collections.Generic.IList GetAllInstances()
    {
        return ObjectFactory.GetAllInstances();
    }

    public object GetInstance(System.Type type)
    {
        return ObjectFactory.GetInstance(type);
    }

    public T GetInstance()
    {
        return ObjectFactory.GetInstance();
    }

    public object TryGetInstance(System.Type type)
    {
        return ObjectFactory.TryGetInstance(type);
    }

    public T TryGetInstance()
    {
        return ObjectFactory.TryGetInstance();
    }
}

Banalna, nic dodać, nic ująć. :)

Teraz wystarczy przy starcie aplikacji na samym początku zarejestrować nasz resolver:

IoC.RegisterResolver(new StructureMapResolver());
Takie podejście do sprawy rozwiązało mi problem przy zmianach wersji kontenera. Mogę dzięki temu także użyć każdy inny kontener, ale zostanę przy StructureMap. Jak zostanie udostępniona nowa wersja to zmieniam tylko referencję w projekcie głównym nie dotykając projektów bazowych (frameworka).

Tagi:

.Net

6 października 2009, 15:36 dario Komentarze (0)

Design Pattern - podstawowe wzorce na jednej karcie

Przypadkiem trafiłem na fajny cheetsheet zawierający zestawienie podstawowych  wzorców projektowych, może się komuś przyda :)

Design Patterns

Tagi:

.Net

30 kwietnia 2009, 11:52 dario Komentarze (0)

Extension method - cały zbiór

Prezentowałem już na swoim blogu metody, które używam w swoich projektach.

Okazało się, że istnieje serwis zawierający zbiór takich metod ułatwiających życie/kodowanie :) Mowa tu o www.extensionmethod.net.

 

  Metod w serwisie narazie nie jest wiele, ale może znajdziecie coś pożytecznego dla siebie.

Tagi:

.Net

17 marca 2009, 01:19 dario Komentarze (0)

Kilka przydatnych metod - extension methods

Poniżej prezentuję kilka metod rozszerzających (extension method), które napisałem jakiś czas temu i do dziś wykorzystuję w swoich projektach.

IsAssignableFromAny

Sprawdza czy dany obiekt jest pochodną któregoś z podanych typów.

public static bool IsAssignableFromAny(this object value, params Type[] args)
{
    foreach (Type t in args)
    {
        if (value.GetType().IsAssignableFrom(t))
        {
            return true;
        }
    }
    return false;
}

Przykład:

public class A {}
public class B {}
public class Boo : A {}
 
Boo x = new Boo();
bool x.IsAssignableFromAny(typeof(A), typeof(B));

EqualsAny

Sprawdza czy dany obiekt jest równy którejś z wartości z listy argumentów.

public static bool EqualsAny(this T value, params T[] args)
{
    foreach (T t in args)
    {
        if (value.Equals(t))
        {
            return true;
        }
    }
    return false;
}

Przykład:

int x = 5;
bool result = x.EqualsAny(1, 2, 3, 5, 7, 9);

Default

Sprawdza czy wartość obiektu jest pusta (null). Jeśli nie to zwraca ten obiekt, w przeciwnym przypadku zwraca wartość domyślną.

public static T Default(this T value, T defaultValue)
{
    return value == null ? defaultValue : value;
}

Przykład:

int? x = null;
int? y = x.Default(5);

ChangeType

Zmienia typ danego obiektu na podany. Metoda ta dobrze radzi sobie z typami Generic.

public static object ChangeType(this object value, Type conversionType)
{
    if (conversionType == null)
    {
        throw new ArgumentNullException("conversionType");
    }
    if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
    {
        if (value == null)
        {
            return null;
        }
        NullableConverter nullableConverter = new NullableConverter(conversionType);
        conversionType = nullableConverter.UnderlyingType;
    }
    return Convert.ChangeType(value, conversionType);
}

Przykład:

object x = 5.0;
object y = x.ChangeType(typeof(int));

ConvertTo

Skrócona i zarazem generyczna wersja ChangeType.

public static T ConvertTo(this object value)
{
    return (T)ChangeType(value, typeof(T));
}

Przykład:

object x = 5.0;
object y = x.ConvertTo();

Between

Sprawdza czy dana wartość liczbowa typu int zawiera się w przedziale. Równie dobrze można dodać klony tej metody dla: double, single, float.

public static bool Between(this int value, int min, int max)
{
    return (value > min && value < max);
}

Przykład:

bool result = 5.Between(1, 3);

Kolejnym razem kilka pomocniczych metod rozszerzających i zarazem skracających działania na string'ach.

Tagi:

.Net

O autorze

Dariusz Gil - projektant i programista aplikacji internetowych budowanych na platformie Microsoft w technologii ASP.NET (C#) oraz MS SQL Server. Obecnie właściciel (narazie :)) jednoosobowej firmy Softio.

Filtruj używając APML