Mono.Sms y Windsor Container
Para ponerle un poco de sabor al Core de Mono.Sms, una de las cosas que me encargué de añadir es la capacidad solicitar los proveedores que estén disponibles para enviar mensajes por medio de un container de IoC. Para los que no sepan que es esto, pueden tener una introducción aquà con Spring.Net, o aquà utilizando Windsor.
Para dicha Inversion de Control (IoC) estoy usando Windsor Container.
Este caso todos los proveedores son inyectados, es decir, dejo que el container me entregue en mano, todas la implementaciones existentes de IProvider para la aplicación. Cada proveedor implementa la interfaz IProvider:
namespace Mono.Sms.Core.Provider { public interface IProvider { string Name { get; set; } string Domain { get; set; } bool UseSmtp { get; set; } string HostName { get; set; } string DataPost { get; } string Sign { get; } string Message { get; set; } CelNumber CelNumber { get; set; } int NumberOfCharacters { set; get; } string Description { get; set; } } }
y luego configuro los proveedores para que Windsor sepa sobre ellos y pueda crear los objetos:
<castle> <components> <component id="ProviderPersonalPost" service="Mono.Sms.Core.Provider.IProvider, Mono.Sms" type="Mono.Sms.Core.Provider.PersonalProvider, Mono.Sms" lyfestyle="singleton" > <parameters> <Name>Personal</Name> <Domain>@personal-net.com.ar</Domain> <UseSmtp>false</UseSmtp> <HostName>host25.200-43-139.telecom.net.ar</HostName> <Port>80</Port> <NumberOfCharacters>138</NumberOfCharacters> <Description>Este proveedor permite la entrega de mensajes a un celular Personal</Description> </parameters> </component> <component id="ProviderPersonalMail" service="Mono.Sms.Core.Provider.IProvider, Mono.Sms" type="Mono.Sms.Core.Provider.PersonalProvider, Mono.Sms" lyfestyle="singleton" > <parameters> <Name>Personal</Name> <Domain>@personal-net.com.ar</Domain> <UseSmtp>true</UseSmtp> <HostName>host25.200-43-139.telecom.net.ar</HostName> <Port>80</Port> <NumberOfCharacters>110</NumberOfCharacters> <Description>Este proveedor permite la entrega de mensajes a un celular Personal utilizando mails.</Description> </parameters> </component> </components> </castle>
En este caso hemos creado 2 implementaciones para enviar mensajes a una misma empresa, una forma es haciendo un post, y la otra utilzando mails. Hablando en el idioma de Windsor container, hemos creado aquà 2 Componentes (ProviderPersonalPost y ProviderPersonalMail), para un mismo Servicio (IProvider).
Luego para pedirle al container que nos entregue todas las implementaciones de los servicios IProvider, realizo esta siguiente iteración:
public IList<IProvider> GetAllProviders() { IHandler[] handles = container.Kernel.GetHandlers(typeof (IProvider)); IList<IProvider> providersImpl = new List<IProvider>(); foreach (IHandler hdlr in handles) { providersImpl.Add((IProvider)hdlr.Resolve(CreationContext.Empty)); } return providersImpl; }
Se puede ver que agrego a una lista providersImpl todos los proveedores y los retorno. Y con esto tengo en mano a todos los proveedores con los que puedo mandar mensajes.
Se preguntarán: “Es necesario todo esto para una simple aplicación de sms?”, la respuesta es “No”. Como se sabe, IoC es un principio de diseño, y no un requerimiento indispensable.
Opiniones ? Sientanse como en casa