No more System.IO.File

If you are working with .Net and you need to read/write files you may be familiar with the System.IO.File class which provides many methods to manipulate files. But there is an issue with that class: its methods are static and because of that you won’t be able to mock it*.

After dealing with this situation for several years and using always a very similar strategy, I finally decided to create a reusable component to encapsulate the System.IO.File class.

The component I created is called System.IO.Utilities, its code is available on Github and it is also published on NuGet, ready for you to use it. At this moment it just provides an interface with one implementation that wraps the System.IO.File class.

Here you can see how to use it.

Contributions are welcome 😉

(*to be more precise: you won’t be able to mock that class with proxy-based mocking tool like Moq, but you can still mock it with «lower-level» tool like TypeMock)

Refactoring .Net applications: How-to NuGet

 

Let’s say you have two .Net applications: A and B and a shared component C. From a source code versioning point of view you could have:

  1. RepoFor(A, B, C)
  2. RepoFor(A, B) and OtherRepoFor(C)
  3. RepoFor(A, C) and OtherRepoFor(B)
  4. RepoFor(B, C) and OtherRepoFor(C)
  5. RepoFor(A)  and RepoFor(B) and RepoFor(C)

Except for scenario (1), all the other scenarios would require to clone more than repo, and at the same you could have additional issues when dependencies AC and BC are established at source code level.

The «elegant way» of solving this situations is to establish the dependency at binary level, that is: A and B should depend on C.dll not on C source code. So to do that you need NuGet.

NuGet is a package manager for .Net that will allow to publish packages containing .dlls (and some other stuff too).

The following diagram illustrates the suggested solution:

nuget

Here are 2 short videos I recorded to show how to create and publish NuGet packages.

 

Refactoring .Net applications Series

The main project I am currently working on, is composed of hundred of C# projects, all of them grouped into 3 git repositories: user-facing apps, background-apps and commons. The main webapp project in placen on the user-facing repo but depends on other projects that are placed in the other repositories. Because of this, to build the main webapp you have to clone then 3 repositories.

This situation has some drawbacks:

  • It is uncomfortable for developers working on the webapp
  • The high coupling between repositories/projects brings a big complexity when you have several teams working in parallel
  • The maintenance/evolution of the system gets too complex

To deal with this situation we decided to «cut» the system in several dimensions: functional, technical and SCM. So in the upcoming post I will share the different strategies we are using.

La pesada herencia

La pesada herencia

La pesada herencia es una frase que ha sonado bastante en el terreno político en Argentina en los últimos meses, pero no voy a hablar de política. Sino del código legacy que he heredado en el proyecto que estoy trabajando.

Esta semana completamos la tercera iteración del proyecto, todo en orden hasta el momento. Pero en esta cuarta iteración comenzamos a integrar el módulo que veníamos desarrollando con el resto del sistema, el cual es un sistema legacy: sin pruebas, con muy alto acoplamiento, baja cohesión, código oscuro, etc. El cliente es consciente de esto y por ello no se sorprendió cuando le dijimos que la fecha de salida a producción que habíamos hablado no sería factible. En cierto modo entendió «la pesada herencia». Ok, bien, es la realidad y no es fácil pero debemos afrontarla.

Pero de aquí a un año ya no podremos culpar a «la pesada herencia» porque si dentro de un año el sistema sigue siendo legacy, entonces no será «la pesada herencia» sino nuestra triste incompetencia.

NetConfUY 2016, pensamientos finales

Mi balance de la conferencia es muy positivo, llevé más de lo que esperaba. La organización estuvo impecable y el contenido fue de primer nivel.

Por otro lado, hacía bastante que no asistía a un evento «Microsoft-related», en general en los últimos años me he inclinado más por eventos/conferencias más relacionadas a «ingeniería de software» (xpconf, uqbar, socrates, etc) que a tecnologías específicas. Un patrón que noto en los eventos/conferencias centrados en tecnología es que casi todos el contenidos (o al menos la mayoría) está centrado en mostrar nuevas tecnologías, algunas de las cuales están aún en estado «beta» sin prestar mayor atención a «buenas prácticas». Un ejemplo concreto: en ninguna de las sesiones que asistí en la NetConf se hizo mención a como testear software construido con las tecnologías presentadas. Obviamente alguien podrá decir con toda razón que esas cuestiones estaban fuera del alcance de la conferencia, pero personalmente son cosas sobre las que me hubiera gustado escuchar.

NetConfUY 2016, día 3

NetConfUY 2016, día 3

La jornada comenzó con una charla no tan técnica de Alvaro Lame (un referente de la industria uruguaya de software) quien habló sobre la actualidad y los desafíos de la economía digital en Uruguay. La exposición fue muy buena y con un montón de datos interesantes.

A continuación Diego González y Lucas Pallarés dieron una sesión de programación sobre Hologens y codearon un juego en 40 minutos, impresionante. La sesión fue interesante y arriesgada pero todo salió impecable.

En el siguiente bloque escuché a Mariano Vazquez hablando sobre micro-servicios. Comenzó explicando los fundamentos y luego compartió varias de sus lecciones aprendidas en el día a día con este tema.

Ya cerrando la mañana Victor Silva habló sobre DevOps, PowerShell y Windows Containers. Esta fue una de las sesiones que me resultó más útil, ya que no estaba al tanto de varias de las cuestiones mencionadas y al mismo tiempo resultan ser todas cosas aplicables a mi proyecto actual. No voy a entrar en mayor detalle sobre la sesión pero les dejo algunas «keywords» para googlear: Windows Nano Server y PowerShell DSC.

Luego del almuerzo estuve rondando de un lado a otro haciendo sociales. En ese contexto estuve hablando con Dalmiro Granias, un desarrollador del equipo de Octopus y con Kevin Pilch, del equipo de C# en Microsoft.

Ya en el último bloque de la tarde escuché a Hernán Guzmán hablando sobre Serverless Computing usando Azure Functions (un análogo a Webtask de Auth0). Como la sesión terminó un poco antes de lo planeado, llegué a ver el cierre de la sesión de RodolfoF sobre Asp.Net Core, un tema con el cual vengo experimentando desde hace un tiempo y que sin dudas es uno de los temas calientes en la actualidad del mundo .Net.

La jornada finalizó con un after en el que compartimos empanadas, cerveza y música con la compañía de un mago que nos entretuvo con muy buenos trucos con cartas y sogas.

NetConfUY 2016, día 2

El día comenzó con el Keynote de Edu Mangarelli, como siempre, un excelente orador. Su keynote rondó alrededor de 3 temas calientes: Machine Learning, Bots

A continuación Gabriel Cor habló sobre Hologens, entre anécdotas y chistes contó un algunos casos del uso de Hologens en proyectos reales. Muy interesante.

El siguiente bloque de charlas estuvo dedicado a servicios cloud: primero MatiasQ habló sobre Azure Search y luego Tony Poza habló sobre Cognitive Services. Dos temas interesante que habilitan (o facilitan muchísimo) la resolución de ciertas situaciones.

Ya por la tarde Mariano Sanchez habló sobre TypeScript, la charla comenzó bien, pero me fui antes del final porque para mi gusto TypeScript intenta «mejorar JavaScript» pero paradójicamente «le quita a JavaScript» las cuestiones que más me gustan. En fin, más allá de esta cuestión de gustos, la sesión de Mariano estuvo muy bien (al menos la parte que escuché). La siguiente sesión fue muy útil e interesante: Kevin Pilch habló sobre el futuro de C#. Mi evaluación de los futuros cambios de C# tiene resultado «neutro» en el sentido que la mitad de las cosas me gustaron mucho mientras que la otra mitad me parecieron «aterradoras».

En el siguiente bloque estuve «saltando» de una sala a otra y la verdad no puedo opinar sobre las sesiones.

Ya en el último turno estuve en la sesión de Azure Stream Analytics de Leo Micheloni. Me gustó mucho que además de explicar el producto, Leo compartió varias recomendaciones consecuencia de su experiencia real con el producto.

Y así se fue el día 2.