[deprecated]
Bom, tenho escrito o bastante para nem precisar perguntar como você está! Né?!
Já estamos íntimos e agora vou contar uma novidade! Implementei o suporte a dois containers bem conceituados no mercado e simplifiquei o modelo para que você possa implementar facilmente uma nova extensão para qualquer IoC container que tenha o interesse de trabalhar.
Só para mostrar como é simples, está aqui todo o código para estender o Oragon Architecture Application Hosting para o Ninject.
public interface INinjectFactory : IContainerFactory<IKernel> { } public class NinjectApplicationHostController : ApplicationHostController<INinjectFactory, IKernel> { } public class NinjectApplicationHost : ApplicationHost<NinjectApplicationHostController, INinjectFactory, IKernel> { }
Se não se convenceu ainda, aqui está o código para criar uma integração nova com o SimpleInjector
public interface ISimpleInjectorFactory : IContainerFactory<Container> { } public class SimpleInjectorApplicationHostController : ApplicationHostController<ISimpleInjectorFactory, Container> { } public class SimpleInjectorApplicationHost : ApplicationHost<SimpleInjectorApplicationHostController, ISimpleInjectorFactory, Container> { }
Simples né?!
A escolha dos dois frameworks se deu pelas suas características enquanto o SimpleInjector é o mais rápido em diversos benchmarks, o Ninject é de cara o mais procurado. Embora eu ainda continue usando o Spring.Net em meus projetos, você pode seguir com seus próprios frameworks e pipelines de aplicação independentes. 3 projetos foram criados para exemplificar.
Eu ainda estou trabalhando na identificação de como usar o ciclo de vida automático desses caras (autocarregamento) etc, para poder implementar a chamada ao pipeline no Start e Stop do Windows Services, inclusive se você já souber, me conte.
No Spring.Net o ciclo de vida é gerenciado de 2 formas, automática, com a implementação de 2 interfaces IInitializingObject, própria do Spring e IDisposable. No load do Spring a interface IInitializingObject permite o controle do fluxo com o método AfterPropertiesSet, enquanto no unload do Spring.Net o método Dispose é chamado.
Também, para o Spring, implementei uma segunda alternativa que é usar a interface ILifeCycle, que provê os métodos Start e Stop, ficou assim:
public interface ISpringFrameworkFactory : IContainerFactory<IApplicationContext> { } public class SpringFrameworkApplicationHost : ApplicationHost<SpringFrameworkApplicationHostController, ISpringFrameworkFactory, IApplicationContext> { } public class SpringFrameworkApplicationHostController : ApplicationHostController<ISpringFrameworkFactory, IApplicationContext> { public override void Start() { foreach (var item in this.Container.GetObjects<ILifecycle>().Select(it => it.Value)) { item.Start(); } } public override void Stop() { if (this.Container != null) { foreach (var item in this.Container.GetObjects<ILifecycle>().Select(it => it.Value).Reverse()) { item.Stop(); } this.Container.Dispose(); this.Container = null; } } }
Bem simples né?!
Simples mas muito eficiente. Cada uma dessas integrações representam 100% do código necessário para toda a criação da integração.
A propósito, o Factory, do container é um ponto de configuração. Isso acontece pela necessidade de configuração dos frameworks atuais. Como todos se baseiam em configuração fluent, que não consigo abstrair, nada mais justo que delegar a você a melhor forma para criar seus containers. O resultado é que você precisará de mais uma classe em seu projeto, ou em sua infraestrutura, apenas para inicializar o container. Todo o resto fica com o Oragon Architecture.
Se você quer que seu IoC container esteja presente no Oragon, faça um Pull Request ou me mande um email respondendo as seguintes perguntas:
1) Qual o nome do framework e endereço do projeto
2) Como manipular o ciclo de vida do container e dos objetos definidos nele (há uma interface, uma marcação, métodos específicos, etc). Responder dizendo que não há manipulação também é válido.
Para que você entenda o que quero, vou citar o Spring.Net que conheço bem:
1) Qual o nome do framework e endereço do projeto
R: Spring.Net ( http://www.springframework.net/ e http://www.springframework.net/doc-latest/reference/html/index.html )
2) Como manipular o ciclo de vida do container e dos objetos definidos nele (há uma interface, uma marcação, métodos específicos, etc). Responder dizendo que não há manipulação também é válido.
Perguntas e respostas simples, né?!
Bom, espero que tenha gostado!
0 comentários