miércoles, 15 de marzo de 2017

Cuando utilizar struct

Definir Struct cuando tenga las características siguientes:
  • Representa lógicamente un valor único, de forma similar a los tipos primitivos (intdouble, etc..).
  • Tiene un tamaño de instancia inferior a 16 bytes.
  • Es inmutable.
  • No tiene que aplicar la conversión boxing (cast) con frecuencia.
  • Como parámetro de un método es pasado por valor, en cambio una clase es pasada por referencia.
En los demás casos, debe definir los tipos como clases.

Error al resolver una dependencia

En muchas ocasiones cuando usamos abstracciones y tenemos un contenedor de inversión de dependencias que resuelve dichas abstraciones, como por ejemplo Unity o Autofac, es posible que nos surja un error similar al siguiente:

"An error occurred when trying to create a controller of type 'Prototype02Controller'. Make sure that the controller has a parameterless public constructor."

Esto ocurre porque tienes un controlador en una web Api similar al siguiente:

    [RoutePrefix("api/authentication")]
    [ExceptionsHandler]
    [AuthorizeAD(new string[] { "MasterRole" })]
    public class AuthorizationController : ApiController
    {
        private readonly IAuthorizationService _authorizationService;
        public AuthorizationController (AuthorizationService authorizationService)
        {
            Throw<ArgumentNullException>.WhenObject.IsNull(() => authorizationService);
            _authorizationService = authorizationService;
        }

        [HttpGet]
        [Route("getAuthenticatedUserAsync")]
        [ExceptionsHandlerAttribute]
        public async Task<HttpResponseMessage> GetAuthenticatedUserAsync()
        {
            dynamic user = await _authorizationService.GetAuthenticatedUserAsync();
            if (user == null)
                return null;
            return Request.CreateResponse(HttpStatusCode.OK, new { user });
        }
    }

Estamos pasando un objeto en lugar de una abstracción por lo que el contenedor de inversión de dependencias no sabrá resolverlo y nos lanzará el error que hemos visto.