Classes (projeto com IoC)

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>();

}}}

Anúncios

Carregar objetos no contexto

Cenário:

Aplicação em 3 camadas, sendo elas:

APRESENTAÇÃO:

this.Contrato = ContratoNegocio.Obter(codContrato);

NEGOCIO:

public Contrato Obter(int codContrato)
{
return ContratoRepositorio.Obter(codContrato);
}

REPOSITÓRIO (Onde encontra-se o entity)

public Contrato Obter(int codContrato)
{
using (DBEntities e = new DBEntities())
{
e.Configuration.ValidateOnSaveEnabled = false;
e.Configuration.LazyLoadingEnabled = false;
e.Configuration.AutoDetectChangesEnabled = false;
e.Configuration.ProxyCreationEnabled = false;

Contrato contrato = e.Contrato

       .Include(“Acesso”)
       .Include(“Advogado”)
       .Include(“ContratoEndereco”)       
       .Include(“ContratoEndereco.Cep”)
       .Include(“ContratoEndereco.Cep.Bairro”)
       .Include(“ContratoEndereco.Cep.Bairro.Cidade”)
       .Include(“ContratoEndereco.Cep.Bairro.Cidade.Estado”)
       .Include(“Situacao”)

.AsNoTracking()
.FirstOrDefault(p => p.codContrato == codContrato);

return contrato;
}
}

As classes que estão referenciadas nos includes serão carregadas dentro do objeto [Contrato], elas fazem parte da sua composição (No banco de dados são FKs), possivelmente tais classes carregadas serão utilizadas depois nos procedimentos necessários.

Quando o objeto [Contrato] for obtido na camada de apresentação ele estará fora do contexto do Entity, pois foi dado [Dispose]  no contexto quando finalizou o [Using] na Repositório.

Links mvc & EF codefirst

Segue abaixo alguns links para apoio no desenvolvimento de aplicações utilizando MVC & EF Codefirst

http://www.entityframeworktutorial.net/
http://msdn.microsoft.com/pt-br/library/hh972463.aspx
http://msdn.microsoft.com/en-us/data/jj574232.aspx
http://blogs.msdn.com/b/webdev/archive/2013/11/01/tutorial-series-updated-for-entity-framework-6-code-first-with-mvc-5.aspx
http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc
http://weblogs.asp.net/manavi/archive/2011/03/27/associations-in-ef-4-1-code-first-part-1-introduction-and-basic-concepts.aspx
http://weblogs.asp.net/ricardoperes/archive/2013/04/29/entity-framework-code-first-relations.aspx
http://www.asp.net/mvc/tutorials/mvc-5
http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application
http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application
http://weblogs.asp.net/shijuvarghese/archive/2013/03/03/generating-entity-data-model-diagram-from-ef-code-first-dbcontext.aspx
http://codefirst.codeplex.com/
http://efmvc.codeplex.com/
http://imasters.com.br/linguagens/asp/asp-net-mvc-realizando-a-paginacao-de-dados/

sempre atualizando…

Select com Linq em DataTable

Segue abaixo um pequeno exemplo de como fazer um select com Linq em um DataTable, é bem simples.

DateTime dtMax = Convert.ToDateTime(((
   from DataRow dr in dt.Rows
orderby Convert.ToDateTime(dr["Posting Date"]) descending
 select dr).FirstOrDefault()["Posting Date"]));

Update com Join

Para atualizar registros de uma tabela com dados que estão em uma tabela diferente podemos utilizar UPDATE com JOIN, como vou demostrar a seguir.

No exemplo a coluna [descricaoProfissao] da tabela [Pessoa] e atualizada com o conteúdo da coluna [descricao] que esta a tabela [Profissao], para isso temos que fazer um JOIN utilizando a PK e FK [idProfissao]. Os campos que eu posso atualizar neste caso são somente os correspondentes ao alias [Pes] da tabela [Pessoa] , pois é o que esta indicado depois da palavra [UPDATE] que identifica o que será atualizado.

-- Select 1
SELECT idProfissao , -- PK
       descricao
  FROM Profissao

-- Select 2
SELECT idPessoa , -- PK
       idProfissao , -- FK
       nome ,
       descricaoProfissao
  FROM Pessoa

-- Update com JOIN
UPDATE Pes
   SET Pes.descricaoProfissao = Pro.descricao ,
       Pes.nome = Pes.nome + ' - ' + Pro.descricao
  FROM Pessoa AS Pes
  LEFT JOIN Profissao AS Pro ON Pro.idProfissao = Pes.idProfissao
 WHERE Pes.idPessoa = 999

O exemplo e simples e ilustrativo, mas pode ajudar.