pátek 29. července 2011

Reflexe - dynamické volání metod

Dnes jsem se dostal před problém, dynamicky volat funkce v nějaké třídě. Někde budu mít uloženo jméno funkce a seznam parametrů s hodnotamy a já takto zavolám funkci. V .NETu to není samozřejmě problém díky vlastnosti zvané reflexe.

Uvádím jednoduchý příklad, pomocí kterého zavoláte funkci jejím jménem:


        public static string InvokeStringMethod(string typeName, string methodName)
        {
            // Get the Type for the class
            Type calledType = Type.GetType(typeName);

            // Invoke the method itself. The string returned by the method winds up in s
            String s = (String)calledType.InvokeMember(
            methodName,
            BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static,
            null,
            null,
            null);

            // Return the string that was returned by the called method.
            return s;
        }

středa 27. července 2011

WCF Přenos velkých dat (Large objects), problémy s přenosem složitějších objektů

1. Při serializaci a deserializaci objektů, které přenášíte přes WCF  se vám může vyskytnout vyjjímka:
"System.Runtime.Serialization.SerializationException : Maximum number of items that can be serialized or deserialized in an object graph is '65536'. Change the object graph or increase the MaxItemsInObjectGraph quota.". To znamená, že přenášíte příliš velké množství položek a musíte upravit konfiguraci  chování koncového bodu tak, aby mylo možné přenášet velké množství položek. 

Příklad: 







2. Přestože jsem měl nastavený přenos velkého množství položek, někdy se mi přenos pomocí WCF  zasekával. Pátral jsem po tom problému a zjistil jsem, že WCF serializér umí přenášet jen data, které jsou serialozovatelné (Serializable).

MessageQueing - MSMQ

WCF Notifikace

WCF Transakce

Info:
http://msdn.microsoft.com/en-us/magazine/cc163688.aspx#S3


V každé literatuře o .NET se dočtete o podpoře transakcí uvniřt .NETu. A všechny příklady zabívající se touto problematikou jsou ukazovány na databázích. Nebudu zde popisovat jednotlivé programovací konstrukce, kterých se na netu v příkladech vyskytuje hodně. Zmíním jen konstrukci tzv. ambientní transakce, což je blok, uvnitř kterého probíhá automaticky transakce. Tato transakce se sama zahájí a na konci voláním metody Complete() se potvrdí.


using (TransactionScope sc = new TransactionScope)
{
sc.Complete();
}


Ale nyní přichází požadavek. Potřeboval bych naprogramovat pole objektů, které spravuji v paměti a potřebuji aby nad tímto polem fungovalo transakční zpracování. Je to možné? Funguje to? 
Odpověď zní ANO i NE.


Samozřejmě je o možné naprogramovat, ale nefunguje to automaticky. Nelze deklarovat před blokem proměnou, pak uvnitř bloku nastavit nějakou hodnotu této proměnné. Nakonec transakci nepotvrdit. Hodnota se nevrátí do původního stavu.


Proč?
Transakce můžeme využívat pouze transakčním zdrojem dat, nad transakčním modelem. Takovým transakčním zdrojem je například nějaké databázové připojení - SqlConnection. Pokud chceme transakce využívat pro jednoduché datové typy nebo objekty, musíme pro ně naprogramovat transakční zdroj. Na internetu lze stáhnout již naprogramované transakční zdroje:





Developer blog

... od nynějška zde budu psát své vývojářské postřehy