Segue abaixo um processo especifico para criação de classes em um projeto que utiliza IoC e principio DIP:
Processo para criação de classes:
1) APPLICATION
> Criar uma interface;
> Criar uma classe;
> Adicionar a referencia da classe de Controller em:
[ProjetoExemplo.Web/App_Start/NinjectWebCommon.cs] no método [RegistraController]
[ProjetoExemplo.Teste/Infraestrutura/NinjectCommon.cs] no método [RegistraController]
Ex: Kernel.Bind<IExemploController>().To<ExemploController>();
> Adicionar a propriedade da controller na classe [BasePage] dentro da region [Propriedades] (Se a classe controller for utilizada dentro de um UserControl, deve-se adicionar a propriedade na [BaseUserControl] tambem).
Ex da propriedade:
[Inject]
public IExemploController ExemploController { get; set; }
Esta propriedade serve para pegar a instancia da controller que esta dentro do Kernel do Ninject onde é feito o IoC para todas as demais instancias de classes (Negocio e repositorio).
Quando uma classe de negocio for utilizada dentro de uma classe controller ou de outra negocio, a dependencia deve ser inserida no construstor da classe atraves da interface correspondente. O arquivo [ExemploController] expoe um exemplo sobre isso.
2) DOMINIO
> Criar uma interface;
> Criar uma classe;
> Adicionar a referencia da classe de negocio em:
[ProjetoExemplo.Web/App_Start/NinjectWebCommon.cs] no método [RegistraNegocio]
[ProjetoExemplo.Teste/Infraestrutura/NinjectCommon.cs] no método [RegistraNegocio]
Ex: Kernel.Bind<IExemploNegocio>().To<ExemploNegocio>();
3) REPOSITORIO
> Criar uma interface;
> Criar uma classe;
> Adicionar a referencia da classe de Repositorio em:
[ProjetoExemplo.Web/App_Start/NinjectWebCommon.cs] no método [RegistraRepositorio]
[ProjetoExemplo.Teste/Infraestrutura/NinjectCommon.cs] no método [RegistraRepositorio]
Ex: Kernel.Bind<IExemploRepositorio>().To<ExemploRepositorio>();
OBS: O processo não precisa necessariamente seguir a ordem descrita acima.
EXEMPLO DA CLASSE [NinjectWebCommon]:
using (…)
[assembly: WebActivatorEx.PreApplicationStartMethod(
typeof(ProjetoExemplo.Web.NinjectWebCommon), “Start”)]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(
typeof(ProjetoExemplo.Web.NinjectWebCommon), “Stop”)]
namespace ProjetoExemplo.Web
{
public static class NinjectWebCommon
{
public static StandardKernel Kernel { get { return _kernel; } }
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
private static StandardKernel _kernel;
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}
public static void Stop()
{
bootstrapper.ShutDown();
}
private static IKernel CreateKernel()
{
_kernel = new StandardKernel();
try
{
_kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
_kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(_kernel);
return _kernel;
}
catch
{
_kernel.Dispose();
throw;
}
}
public static void RegisterServices(IKernel Kernel)
{
RegistraNegocio(Kernel);
RegistraRepositorio(Kernel);
RegistraController(Kernel);
}
private static void RegistraController(IKernel Kernel)
{
Kernel.Bind<IConsultaExemploController>().To<ConsultaExemploController>();
}
private static void RegistraNegocio(IKernel Kernel)
{
Kernel.Bind<IExemploNegocio>().To<ExemploNegocio>();
}
private static void RegistraRepositorio(IKernel Kernel)
{
Kernel.Bind<IExemploRepositorio>().To<ExemploRepositorio>();
}}}