Skip to main content

Posts

Showing posts with the label method

How should we treat virtual methods exposed in APIs (Part 2)

In postul precedent am descutat despre o problema care poate sa apara cand expunem intr-un API metode virtuale, care sunt apoi suprascrise de catre un alt dezvoltator. Iar o versiune ulterioara a API schimba comportamentul aplicatiei in asa fel incat suntem obligati sa schimbam codul care foloseste API expus. Mai jos gasiti o posibila solutie la aceasta problema. public abstract class FooBase { private void DoAction() { // Custom code that can be executed by our method. DoActionCore(); // More custom code that can be executed by our method. } public virtual void DoActionCore() { // Some action } } public class MyCustomFoo : FooBase { public override void DoActionCore() { // My custom code of MyCustomFoo that will be // executed by DoAction method from base class. } } O solutie de acest gen o sa functioneze, doar daca cel c...

How should we treat virtual methods exposed in APIs

Cu cateva zile in urma mi s-a cerut sa investighez de ce nu functioneaza o aplicatie asa cum trebuia in urma unui upgrade de framework, iar cand am gasit cauza problemei am zis ca trebuie sa va zic si voua. Un mic framework care era folosit definea o clasa de baza abstracta, care la randul ei continea cateva metode virtuale. public abstract class FooBase { public virtual void DoAction1() { ... } ... } Implementarea care era facuta in sismul nostru asta in felul urmator: public class MyCustomFoo : FooBase { ... public override void DoAction1() { // Some custom action ... } } Problema la MyCustomFoo este ca metoda DoAction1() nu apeleaza metoda din clasa de baza. Asta nu ar fi nici o problema cat timp cel care a scris acest cod implementeaza aceasta functionalitate. Pe vechia versiune de framework, acest lucru era in regula, dar noua versiune schimba usor o functionalitate si are nevoie neaparat ca metoda din clasa de baza s...

Can we mock an extension method?

Pentru teste mai mult ca sigur ati folosit un framework petru a face mock pe diferite obiecte. In general am folosit Moq pentru a putea face mock la date. Este destul de usor de folosit, mai jos puteti sa gasiti un exemplu: Mock<IService> serviceMock = new Mock<IService>(); serviceMock .Setup(x=>x.Call(It.IsAny<string>)) .Returns(()=> new Result()); Mai sus am creat un mock pentru IService, iar in momentul in care se apeleaza metoda Call cu orice parametru de tip string, se returneaza un nou obiect de tip Result. Nimic deosebit pana acuma. Dar ce se intampla daca vrem sa facem mock la un extension method. Vestea proasta este ca nu se poate face. Majoritatea framework-urilor pentru mock-ing nu suporta aceasta functionalitate. Cea mai buna solutie este sa refactorizam codul daca putem. Dar exista cazuri cand acest lucru nu il putem face sau extension method nu este declarat de noi si vine dintr-un assembly exterior. O solutie comuna, care poate sa fie...

Cum sa salvezi un stream direct intr-un fisier

Cred ca este a 2-a oara când întâlnesc aceasta cerința in decurs de câteva săptămâni. Se da un stream și o locație unde trebuie salvat, se cere să se salveze conținutul la stream in locația data. Din păcate API-ul de .NET nu ne permite să facem acest lucru doar dintr-un apel. O soluție propusa este următoarea: /// <summary> /// Save the stream to the given location. /// </summary> /// <param name="stream">The stream.</param> /// <param name="filePath">The file path where is saved.</param> /// <param name="blockSize">The size of the buffer(in kB)</param> public static void SaveStream(this Stream stream,String filePath,SeekOrigin seekOrigin=SeekOrigin.Begin,int blockSize=1) { //Set the poinder to the begin of the stream. if(stream.CanSeek && seekOrigin==SeekOrigin.Begin) { stream.Seek(0, SeekOrigin.B...

jQuery - extension methods

De ceva vreme, Microsoft a inceput sa pompeze bani buni in jQuery. A fost integrat cu VS 2010( Visual Studio 2010), iar impreuna de MVC se integreaza perfect. Am fost surprins sa descopar ca jQuery permite extension methods. Se pare ca Microsoft isi pune amprenta pe acesta, iar in acest caz eu cred ca intr-un mod placut. Cum se declara: $.extend({ [nume_metoda]: function([lista_parametri]) { [corp_metda] } }); Cum se apeleaza: $.[nume_metoda]([lista_parametrii]) Ar fi interesant de folosit aceste metoda cand vrem sa declaram evenimente noi la anumite controale sau pentru a elimina helperele pe care le declaram uneori pentru tot felul de operatii.