last day (15 days later) » 

11:48 AM
2
Q: Ninject não carrega as dependências. Asp.NET MVC C#

Luiz NegriniEstou usando o NinjectWebCommom trabalhar com Inject. Instalei o pacote via Nuget e automaticamente ele cria uma classe nomeada "NinjectWebCommon" na pasta App_Start, como a própria documentação diz. Preciso saber por que não esta funcionando corretamente, segue alguns trechos de código: Ninject...

 
Tente substituir private readonly IFooService fooService; por public IFooService FooService {get; set;} e remova o parâmetro do construtor da classe FooController. A linha fooService = fooService não é necessária pois o próprio NInject irá inicializar a property com a injeção de dependência.
 
@UlyssesAlves fiz as modificações e não funcionou. O get; set; deixa a interface null.
 
E aquele erro Error activating IFooService No matching bindings are available, and the type is not self-bindable. ainda ocorre depois dessa alteração?
 
@UlyssesAlves não, porém com o service null, o problema continua...
 
O código que você usou com comentários em inglês você tirou de algum artigo? Se sim, teria como nos passar o link pra gente poder analisar melhor?
 
11:48 AM
@UlyssesAlves é parte do Nuget, ele instala automaticamente esta classe dentro do projeto, segue o link da documentação: github.com/ninject/Ninject.Web.Mvc/wiki/…
@brazilianldsjaguar sim para a segunda pergunta, a primeira eu não sei te responder de certeza, mas acredito que a partir da classe usada, ele deveria resolver as outras e ele tiver.
 
@LuizNegrini Então, você herdou sua classe MvcApplication de NinjectHttpApplication, como mostra na página? public class MvcApplication : NinjectHttpApplication
Tem que herdar de NinjectHttpApplication e sobrescrever o método CreateKernel na classe MvcApplication. Se não me engano, essa classe fica dentro do arquivo global.asax.
Não. A documentação diz que tem que fazer essa herança e sobrescrever o método. Talvez seja esse o motivo do problema então. Faz um teste por favor, pra gente ver se é isso mesmo.
 
opa, não herdei não, pois a documentação diz que na instalação do pacote nuget, apenas o que precisa ser feito é instalar, manter o arquivo que ele insere na App_Start e inserir os Binds no RegisterServices...
Já foram tantas tentativas que agora, acredito que tem várias formas de fazer, irei fazer o teste.
tem como passar o trecho onde diz exatamente o que você quer que eu teste?
 
Só essa seção "Using Binaries from Github" mesmo
 
ah sim, mas como você pode ver logo abaixo ele mostra a instalação via Nuget, depois disso ele diz que é possível escolher entre as duas instalações e que aconselha a via Nuget (na qual o fiz).
 
No código mostrado nessa seção ele faz a herança e sobrescreve o método CreateKernel()
hm
Nâo não, @LuizNegrini
Ele não diz que são duas alterantivas. O que ele fala é 'After creating a new MVC3 application" = "Depois de criar uma nova aplicação MVC3", e a criação dessa aplicação foi no primeiro passo, que é a seção que eu te passei
hm
Realmente você está certo
São duas formas mesmo
 
12:01 PM
certo
 
É igual você falou, depois eles comparam as duas formas na seção "What's the difference between these approaches?"
 
então, o que eu acho que pode ser o problema, é que ele esta tentando de alguma forma criar duas instâncias dessas dependências...
isto, exato.
tem uma seção no menu lateral que diz como configurar o controller...
é que é o seguinte também, o projeto no qual estou trabalhando é uma versão Web de um projeto WPF, ele é grande, tem 44 projetos na solution mais este web (45 total).
o mais estranho, é que no HomeController, a aplicação roda que é uma beleza.
 
sei
mas tipo
e se você tentar essa outra forma então?
Pode ser que ela funcione
Tudo bem que as duas deveriam funcionar, mas se nesse caso a primeira forma funcionar você já sai ganhando
e vai usando essa primeira forma até descobrir como fazer a segunda forma funcionar
 
sim, estou terminando de montar aqui e já te passo o feedback... é interessante outra coisa, pois também tem outras formas como mostra ali, com o uso do IoC, muda de acordo com aquela configuração dos controllers que ele passa la, mas na home só funciona com o IoC também.
exato
"A sequencia não contem elemtnos"
elementos*
 
Oi
Conseguiram resolver?
 
12:15 PM
Opa, não! =/
 
@LuizNegrini, qual é a definição do FooService?
O Ninject não poderá injectar FooService se não sabe fazer o Bind das suas dependencias
 
já envio pra vc.
 
public interface ISetorService : IGenericDataService<Setor, Guid, AddEditSetorModel, SearchSetorModel>
{
}
o Foo, é o setor como vc mesmo tinha notado anteriormente.
public interface IGenericDataService<TEntity, TEntityKey, TAddEditModel, TSearchModel> :
ISupportsReadService<TEntity, TEntityKey, TSearchModel>,
ISupportsAddOrUpdateService<TEntityKey, TAddEditModel>,
ISupportsDeleteService<TEntityKey>
{
TAddEditModel FindBy(TEntityKey id);
}
e vai subindo na hierarquia...
 
entendi
E tem classe concreto para cada um desses interfaces, correto?
 
12:19 PM
sim
 
e.g. GenericDataService, SupportsReadService, etc.
 
Então, o ninject não vai injectando todos os dependências - tem que defenir cada um
Por exemplo:
 
o que não consigo entender é por que que no homecontroller ele funciona...
usando o IoC
 
12:22 PM
ok
 
De onde vem essa classe IoC?
 
vem de outro projeto.
claro, na mesma solution hehe
 
Ahhhh
Um outro biblioteca de injeção?
*outra
 
deixa eu verificar também, 30seg
 
talvez é o Unity
 
12:23 PM
using Ninject;
using System;
using System.Threading;

namespace TecBox.UI.Desktop.Framework
{
 
Esse é um projeto Web API? MVC?
 
a solution tem 45, estou reaproveitando o código, pois até então era para aproveitar todas estas camadas, e como funcionou no HomeController, ele tem que funcionar em todos... deve ser apenas algum detalhe... a não ser que eu esteja muito errado.
este projeto no qual estou trabalhando é Web, mas até então o resto todo é tudo WPF
e sim, é usado Unity
 
Aí você colocou o Ninject também
Direto do NuGet, certo?
Não dos binários do GitHub
 
Isso, ele instalou a classe e tudo mais no App_Start
 
certo
Mas esse projeto onde está usando o Ninject
 
12:34 PM
o que tem?
 
É Web, mas é de MVC 3? MVC 5?
 
blz
E qual é o nome do Nuget que instalou?
era o Ninject.Web.Mvc mesmo?
 
Ninject.MVC4
 
Ahhh entendi
 
12:36 PM
não sei qual a diferença do que vc falou para este mvc4
 
Ninject.Web.Mvc = MVC 1, 2 e 3
É que estou tentando encontrar o código fonte e as documentações
Mas não estou achando do MVC4
 
é a mesma, ele diz em algum lugar dela que pode ser usado o mesmo
te ajudo
 
Tem alguma linha aí que está estabelecendo o DependencyResolver?
 
Mas o problema principal é que não está carregando o ISetorService, correto?
 
12:43 PM
Isso
nem no controller com parametro ou com IoC. No homecontroller, se usar o IoC ele carrega (sem parametros no controller dae)
 
Entendi
Mas está certo, deveria usá-lo assim:
public FooController( IFooService fooService )
Chama injeção ao construtor (constructor injection)
Eu sempre uso, mas uso com projeto Web API
 
sim, mas isso nunca funcionou no projeto web, dai fiz o seguinte

public HomeController()
{
this.setorService = IoC.Instance.Resolve<ISetorService>();
}

e roda, mas só no Home.
 
Entendi - mas aí está usando o Unity
 
entendi
que coisa... preciso resolver isso urgente.
 
O detalhe sobre o Ninject, é que precisa "dizer"a ele quais são todas as dependencias
Essa heirarchia que descreveu - é super grande?
public interface ISetorService : IGenericDataService<Setor, Guid, AddEditSetorModel, SearchSetorModel>
{
}

public interface IGenericDataService<TEntity, TEntityKey, TAddEditModel, TSearchModel> :
ISupportsReadService<TEntity, TEntityKey, TSearchModel>,
ISupportsAddOrUpdateService<TEntityKey, TAddEditModel>,
ISupportsDeleteService<TEntityKey>
{
TAddEditModel FindBy(TEntityKey id);
}
 
12:49 PM
tem mais 2 níveis acima
 
kernel.Bind<ISupportsReadService>().To<SupportsReadService>()
kernel.Bind<IGenericDataService>().To<GenericDataService>()
kernel.Bind<ISetorService>().To<SetorService>()
O SetorService seria a última
e todos os dependencias de heirarchia seria antes
 
ISupportsReadToLookupService nesse caso tem 3
vou tentar, eu tenho dificuldade de inserir estes namespaces, é muita coisa no projeto...
 
tipo, primeiro tatara-vó, depois bisavó, depois avó, depois pai...
Entendi
Então
O Ninject tem uma maneira de facilitar ... talvez :P
Esses namespaces estào no mesmo projeto que os Contorllers?
 
opa, manda! hahaha
acabei de ver que o IDataService que é o último nível não tem a classe concreta "DataService"
 
Tem nenhuma classe concreta?
Mesmo que não seja chamada DataService?
*que não se chama
(desculpe, português é o meu segundo idioma rsrs)
 
12:53 PM
é não tem
mas ele funciona, de alguma forma! audhad
 
mas tudo bem
Tem outro NuGet
chamada
Ninject.Extensions.Conventions
assim você pode fazer algo assim:
 
isto faz o trabalho dos binds para mim? Cara, este projeto tem alguns bugs de namespace, ou é o VS que buga, por que, inserindo alguns usings eu não consigo acessar alguns arquivos...
 
kernel.Bind( x => x.FromAssembliesMatching( "*.dll" )
.BindDefaultInterface() );
 
aquelas referencias ali...
 
Tem colisões de namespace?
 
12:57 PM
acho que não, só tem nomes que parecem ser trocados...
 
este "*.dll" o que é?
 
aí dificulta hein rsrs
 
pega todas as dlls da solution ou projeto?
verdade...
 
12:57 PM
mas posso estar errado.
 
Pode colocar outra coisa também
 
psé, o ninject acho que precisa pegar de outro projeto, como fica?
vou instalar ele agora
 
por exemplo:
kernel.Bind( x => x.FromAssembliesMatching( "Cara.Sacanagem.Desse.Projeto.dll" )
 
hahahaha
 
Está instruíndo o Ninject a procurar interfaces e classes nesse(s) DLL
 
12:58 PM
se usar o *.dll ele vai buscar em todos os projetos?
 
beleza
1 minuto
 
Aí o .BindDefaultInterface() vai instruir ao Ninject a fazer o binding de IFoo à Foo, IBar à Bar, IFirmeza à Firmeza, etc.
 
eu não preciso fazer nada, só aquela lambda no bind la dentro do arquivo do App_Start?
 
isso
Com o BindDefaultInterface(), que é o principal
 
1:01 PM
instalei mas ele não aceita essa lambda
ah pera ai, não coloquei isto
 
qual é o código que tem agora?
 
Error 44 Cannot convert lambda expression to type 'System.Type[]' because it is not a delegate type C:\src\git\bitbucket\iwti\tecbox\Retaguarda WEB\App_Start\NinjectWebCommon.cs 68 25 Retaguarda_WEB
 
ele não bate com aquele código né
 
Qual é o código que colocou?
É que o Ninject.Extensions.Conventions é uma extensão do IKernel
 
1:04 PM
exatamente o que vc colocou la em cima
 
kernel.Bind( x => x.FromAssembliesMatching( "*.dll" )
.BindDefaultInterface() );
não temho que por uma herança ali nesse ninjectwebcommon
?
pra poder usar estes metodos do pacote que instalei agora
 
herança não
põe isso lá em cima:
using Ninject.Extensions.Conventions;
 
kkkkkkkk
 
ó! hgahaha
 
1:05 PM
essa DLL kernel.Bind( x => x.FromAssembliesMatching( "Cara.Sacanagem.Desse.Projeto.dll" )
é que tá zoando o projeto mesmo kk
 
brincadeira gente
 
Do que o Luiz já falou, esse projeto é bastante complexo
 
Mas parece que não deveria ser rsrs
 
1:06 PM
é um ERP
:S
rebuilding demora 2 dias.... pera ae.
sudhaushda
 
ERP?
explica para o americano rsrs
 
Planejamento de recurso corporativo (em inglês Enterprise Resource Planning - ERP) é um sistema de informação que integra todos os dados e processos de uma organização em um único sistema. A integração pode ser vista sob a perspectiva funcional (sistemas de finanças, contabilidade, recursos humanos, fabricação, marketing, vendas, compras etc) e sob a perspectiva sistêmica (sistema de processamento de transações, sistemas de informações gerenciais, sistemas de apoio a decisão, etc). O ERP é uma plataforma de software desenvolvida para integrar os diversos departamentos de uma empresa, possibilitando...
 
Você está falando de Enterprise Resource Planning
 
1:08 PM
uma forma de conseguir mais ajuda
 
isso
 
é oferecer uma recompensa
 
Pensei que era uma gíria ;)
 
asuhda não não
Ulysses, só daqui a 2 dias.
 
@LuizNegrini
 
1:08 PM
mas acho que o americano ae pode ajudar! uahduahda
 
Ah sim
eu não sou americando não
k
 
Eu sou =P
 
se é de mim que vcs estão falando
 
por querer ou não rsrs
 
Sul Americano eu sou
 
1:09 PM
Error 60 'Ninject.Extensions.Conventions.Syntax.IIncludingNonePublicTypesSelectS‌​yntax' does not contain a definition for 'BindDefaultInterface' and no extension method 'BindDefaultInterface' accepting a first argument of type 'Ninject.Extensions.Conventions.Syntax.IIncludingNonePublicTypesSelectSyntax' could be found (are you missing a using directive or an assembly reference?) C:\src\git\bitbucket\iwti\tecbox\Retaguarda WEB\App_Start\NinjectWebCommon.cs 69 64 Retaguarda_WEB
 
ahh sim claro! :D
 
Error 59 Cannot convert lambda expression to type 'System.Type[]' because it is not a delegate type C:\src\git\bitbucket\iwti\tecbox\Retaguarda WEB\App_Start\NinjectWebCommon.cs 69 25 Retaguarda_WEB
 
estes 2 erros depois de inserir o using... na verdade eu inseri o using, mas ainda usa o mesmo método... tem que trocar alguma coisa amais ae.
 
Ahh
Luiz, adicione isso depois do FromAssembliesMatching():
.SelectAllClasses()
 
1:10 PM
não da...
 
ou seja:

kernel.Bind( x => x.FromAssembliesMatching( "*.dll" )
.SelectAllClasses()
.BindDefaultInterface() );
 
tem que usar outro metodo
opa
foi
vou testar
 
Tem outros .Selects também
Dependendo do que quer fazer
 
sim, se este funcionar, já fico feliz hehe
ao menos encontra-se o problema
 
Vamos ver né ... estou até ansioso :P
 
1:13 PM
@LuizNegrini se não se importar, tem como passar o seu projeto front end MVC só pra gente testar essa injeção de dependência? Pode tirar todo código de negócio e que não é relevante à injeção de dependência, que aí eu debugo aqui e tento resolver também
 
@LuizNegrini Você consegue ler inglês?
 
ulysses, cara infelizmente não posso =/
consigo
mudou o erro
ISession
Error activating ISession
No matching bindings are available, and the type is not self-bindable.
Activation path:
4) Injection of dependency ISession into parameter session of constructor of type SetorRepository
3) Injection of dependency ISetorRepository into parameter setorRepository of constructor of type SetorService
2) Injection of dependency ISetorService into parameter setorService of constructor of type HomeController
1) Request for HomeController

Suggestions:
1) Ensure that you have defined a binding for ISession.
 
parece que você tem um ISession na classe SetorRepository
 
mas realmente não tem o binding pra este ISession
tem
 
Onde vive esse ISession? Qual assembleia?
 
1:15 PM
1min
 
(assembleia ... é o termo correto? sei lá, tomara que entendem! :p)
@LuizNegrini Perguntei do inglês, pois esse Wiki do ninject Conventions é bem útil para entender o que cada um dessas funções estão fazendo:
 
audhauhda
 
Eu devo colocar o Bind pro ISession?
 
Tem classe concreto dele?
 
1:18 PM
é do NHibernate
não tem
opa, tem
 
Se por algum motivo o *.dll não pegou ele, então sim - põe em frente desse outro bind.
kernel.Bind<ISession>().To<NHibernate.Session>() (ou o que for)
 
na verdade tem o ISessionFactoryBuilder
o problema é acessar essa porcaria! hehe
 
Como que você cria os ISession para seus repositórios agora?
 
eu consegui acessar o ISession, mas não tem a concreta
 
mas o NHiberate tem como criar um ISession, correto?
 
1:23 PM
sim
ele usa isso no projeto inteiro
 
É um metodo?
pois isso também é possivel:
kernel.Bind<ISession>().ToMethod(CriarISession)
public ISession CriarISession() { ... return tal tal tal; }
Mas integrando NHiberate 100% com Ninject ... isso aí é um outro projeto hein!
 
SIm
estou tentando achar alguma referencia pro ISession
nada implementa ele nem o ISessionFactory
 
No caso do NHibernate, não sei se existe mesmo uma concreta
 
vi que em alguns casos dentro do projeto ele recebe o ISession da mesma forma
pelo parametro do construtor
 
sim
Acho que no NHibernate, normalmente é baseando em algum ISessionFactory
usando factory.OpenSession()
Mas não tenho muito experiência com NHibernate, e a experiência que tive foi uns 2 anso atrás :(
 
1:31 PM
tem os factorys aqui mesmo
porém, também ñao tem nenhuma classe implementando
 
Não precisa, necessáriamente
O ninject só precisa saber como gerar um ISession
 
uhum
 
Independente se for um metodo que devolve um ISession, ou uma classe concreta que implementa o mesmo
 
pois é, é o problema
tem os repositórios também
eles que recebem o ISession no constructor
 
Deve ter um configuration.BuildSessionFactory(), certo?
esse te dá um ISessionFactory
 
1:33 PM
achei uma pista
 
Aí o factory.OpenSession() te dá o ISession
 
kernel.Bind<ISetorRepository>().To<SetorRepository>();
vou testar isso e já procuro algo do que vc falou.
 
mas já sei que tem o configurator
 
@LuizNegrini Tenho que sair ...
 
1:35 PM
certo
 
desculpe aí que não consegui resolver 100%
 
cara, me adiciona no facebook se qusier
ou whatsapp
555197625552
 
Obrigado!
E o LinkedIn rsrs
Estou a procura de um emprego aí no brasil
 
isso hehe
consegue me achar la?
 
Mesmo nome?
 
1:36 PM
sim
Error activating ISetorRepository
More than one matching bindings are available.
Matching bindings:
1) binding from ISetorRepository to SetorRepository
2) binding from ISetorRepository to SetorRepository
Activation path:
3) Injection of dependency ISetorRepository into parameter setorRepository of constructor of type SetorService
2) Injection of dependency ISetorService into parameter setorService of constructor of type HomeController
1) Request for HomeController

Suggestions:
1) Ensure that you have defined a binding for ISetorRepository only once.
 
Hmm... acho que não. Tem um montão de Luiz Negrini rsrs
 
manda um whatsapp, depois passo os links
 
Um é CEO rsrs
 
sou ex ceo de uma empresa hehe
trabalho na infoworld hoje.
 
Opa
Achei :D
 
1:38 PM
show
 
tá com cara séria rsrs
mandei convite
 
adhau
 
Então, agora você está binding ISetorRepository duas vezes - uma vez no seu .Bind() e outro naquele do *.dll
 
não posso acessar daqui... no intervalo aceito tudo.
é, então não é o problema isso ae hehe
tirar o selectall aquele
 
Pode, mas aí vai ter que usar o .Select()
Que precisa de uma Func que prova contra os tipos
 
1:40 PM
tirei aquele deixei o anterior, vamos ver.
é, continua no ISession dae.
 
sim
E se fizer algo assim:
kernel.Bind<ISession>().ToMethod(CriarSession);
private ISession CriarSession( IContext context ) {
   return sessionFactory.OpenSession();
 }
estou supondo que tenha acesso a tudo isso no seu NinjectWebCommon
em fim, tenho que me retirar!
Boa sorte aí Luiz!
 
claro
ta certo, valeu a ajuda.
 

last day (15 days later) »