• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    TENCOKACISTROMYProgramovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
    NECROMAN
    NECROMAN --- ---
    SLUPKA: jde mi o to, ze obcas potrebuji debugovat kolikrat se treba vola getter nejake property a zda uz je ta properta v dany okamzik spravne nasatvena nebo ne...
    SLUPKA
    SLUPKA --- ---
    NECROMAN: ten jejich atribut je jejich použití aspektů - nejsem si jist, jestli to platí pokaždé (jde napsat aspekt, který způsobí, že se vůbec volat get či set nebude a pak nevím, jestli to ten breakpoint hitne). Ale tady ten get, set nijak upravený není, krom toho, že po tom setu se notifikují změny.
    NECROMAN
    NECROMAN --- ---
    SLUPKA: takze kdyz pouziji ten atribut [NotifyPropertyChanged] na tridu, kde mam treba
    public string Title { get; set; }
    tak je mozne dat breakpoint na getter a setter te property po tom, co mi to PostSharp upravi?
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    SLUPKA: MS to nekoupi, protoze dela Roslyn, kterej je mnohem vic powerfull. Skoda ze to MS nekoupil v dobe, kdy PostSharp vydali. To jeste o zadnym Roslynu nebyla ani rec.

    btw. na poslednim msfestu rozdavali PostSharp na pozadani. Ja tak ziskal dve licence *jupiii*.
    SLUPKA
    SLUPKA --- ---
    NECROMAN: Zrovna postsharp debugovat jde. a to dokonce můžeš debugovat kompilaci (compile time inicializaci aspektů) a můžeš debugovat i kód injectovaný normálně za běhu.

    Ten kód je podstatně čistší, přehlednější a nemusíš se zabývat všude kravinama (notifikace, logování apod.). Kdyby nebyl PostSharp tak drahý, tak ho používám na většinu projektů, takhle ho používám jen na školní věci, mám akademickou licenci. Škoda, že to MS nekoupí a neudělá z toho část .NETu, aspekty mi přijdou dost nepokryté (v Javě třeba jsou).
    P19
    P19 --- ---
    Nemate predstavu, jak by se dalo v extensio metode u mvc automaticky nareferencovat javascript knihovna do hlavicky? Nebo nejak pristoupit do section?
    Dik
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    NECROMAN: INotifyPropertyChanged obchazime pres CallerMemberNameAttribute. Ale jinak to pouzivame pro lazyloading a lazysaving objektu do objektovy databaze. Zrovna PostSharp je dobrej v tom, ze upravi i *.pdb soubory, takze neni problem s debugovanim.
    NECROMAN
    NECROMAN --- ---
    BUTHRAKAUR: pouzivam MVVM Light s upravenymy zdrojaky, no nevadi...

    Jinak jaky mate nazor na frameworky, ktere pri kompilaci injectuji skript do vaseho kodu, typicky PostSharp pro zjednoduseni implementace INOtifyPropertyChanged a podobne? Sice to na obrazcich vypada hezky, ale ke mne do aplikace to nesmi, jakmile chce clovek debugovat kod, ktery je vygenerovany behem compile time, tak ma smulu.
    Design Pattern Automation – PostSharp
    http://www.postsharp.net/
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    NECROMAN: z hlavy ted nevim, pze jsem delsi dobu WPF/SL nedelal, ale Caliburn/Micro to ma vyreseny - zkousel jsi se na nej kouknout?
    NECROMAN
    NECROMAN --- ---
    TENCOKACISTROMY: asi tak, v SharePoint bylo bezne volani reflexi treba internal metody pro zakladani SPListu, protoze verejne API neumoznovalo vse potrebne. Pak byl treba problem, ze SP3 pro SP2007 zmenil signaturu tohoto internal interface a aplikace prestala fungovat, jo, take jsem od toho rad utekl :)
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    VIRTUALVOID: Tak ja nepredpokladam, ze bych neco takovyho pouzival v produkcnim kodu. To by musel bejt fakt hodne extremni pripad. Hacky jsem do produkce musel nasazovat zatim jen u Sharepointu a od nej jsem utekl.
    NECROMAN
    NECROMAN --- ---
    Vite o nejake best practice, jak pouzivat Dependency Injection v code-behind ve WPF/Silverlight pages? stranky nelze vytvaret pokud vim na vyzadani, ale vzdy musi obsahovat:

    public XYPage()
    {
    InitializeComponent();
    }

    Zatim to resim tak, ze si tam pres service locator v konstruktoru stranky vyzadam potrebny viewModel, ale co jsem cetl, tak explicitni volani ServiceLocatoru neni dobry zpusob.

    InitializeComponent();
    model = ServiceLocator.Current.GetInstance<MainViewModel>();

    Druha moznost me napada primo databinding DataContextu v XAMLu a v konstruktoru jen ulozeni teto instance.

    DataContext="{Binding Main, Source={StaticResource Locator}}"

    InitializeComponent();
    model = (MainViewModel)DataContext;
    VIRTUALVOID
    VIRTUALVOID --- ---
    TENCOKACISTROMY: ktory sa pri najblizsom update compilera zmeni...
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    NECROMAN: Tak tohle je super uber prasarna. Ale je to fakt peknej trik.
    SLUPKA
    SLUPKA --- ---
    NECROMAN: to je docela zajímavé a zajímalo by mne, jak moc jistě to funguje. Protože v době, kdy byl .NET 4.0 nový (neboli nevím, jestli se to ještě stále tak chová), tak pokud jsem udělal třídu s klasickým destruktorem (takový ten co obsahuje this.Finalize(false)) a při vytváření argumentů pro konstruktor padla výjimka, tak v debug režimu se nestalo nic (nebo jsem si ničeho nevšiml), ale v release režimu se zavolal destruktor a tam padla výjimka, protože this bylo null. Zajímavé bylo, že se mi nepodařila nijak odchytnout (ani na AppDomain unhandled exceptions), takže zjistit v čem byla chyba byla opravdu chuťovka. A jelikož jsem nikde GC.Collect nevolal, tak ta výjimka padala opravdu krásně náhodně.
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    ty vole, to je ale neskutecna prasarna :DDDD
    NECROMAN
    NECROMAN --- ---
    Tady je reseni, je to trik s rekurzivne volanymi konstruktory, vyjimkou v konstruktoru a ulozeni instance v destruktoru, tfuj!
    Detaily kdyztak zde (ani jsem netusil, ze se ta diskuze tak rozvine):
    Is it possible to define valid C# interface that cannot be implemented? - Stack Overflow
    http://stackoverflow.com/...it-possible-to-define-valid-c-sharp-interface-that-cannot-be-implemented
    public class CantDeriveMe
    {
        private CantDeriveMe()
        {
        }
        public override string ToString()
        {
            return "My type is " + this.GetType().ToString();
        }
    }
    
    public class OhYeah : CantDeriveMe
    {
        static OhYeah CapturedInstance;
    
        ~OhYeah()
        {
            CapturedInstance = this;
        }
    
        OhYeah() : this(1/String.Empty.Length)
        {
        }
        OhYeah(int blah) : this()
        {
        }
        public static OhYeah Create()
        {
            try
            {
                new OhYeah(4);
            }
            catch (DivideByZeroException)
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
            return CapturedInstance;
        }
        public static void test()
        {
            OhYeah it;
            it = OhYeah.Create();
            Console.WriteLine("Result was ({0})", it);
        }
    }
    H_U_N_T_E_R
    H_U_N_T_E_R --- ---
    NECROMAN: funkce FormatterServices.GetUninitializedObject vytvoří instanci, aniž by volala ctor (pravděpodobně prostě naalokuje na heapu vhodnej počet bytů a kašle na vše). Jak ale vytvořit instanci a zavolat ctor (bez relfexe) netuším :-(
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    NECROMAN: nema to nejaky staticky factory funkce?
    Kliknutím sem můžete změnit nastavení reklam