2012-04-22 6 views
5

He intentado lo siguiente solución encontrada en How can I implement Ninject or DI on asp.net Web Forms? (respuesta de Jason)inyección de dependencias con Ninject 3 en el sitio web ASP.NET

  1. crear un nuevo ASP.NET Web Forms proyectan
  2. Uso NuGet para agregar la Ninject. lib web (que también hará bajar las librerias Ninject.Web.Common y ninject)
  3. Registro su fijaciones personalizadas en App_Start método/NinjectWebCommon.cs/RegisterServices
  4. uso de atributos de inyección en sus páginas

Funciona muy bien en aplicaciones web ASP.NET.

El problema es que quiero usar Ninject para DI en un sitio web ASP.NET , no una aplicación web.

Me he registrado fijaciones personalizadas en NinjectWebCommon/RegisterServices:

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<ITestRepository>().To<TestRepository>(); 
} 

En una página web que inyectarlo:

public partial class _Default : System.Web.UI.Page 
{ 
    [Inject] 
    public ITestRepository _repository { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     System.Diagnostics.Trace.WriteLine(_repository.ExecuteOperation()); 
    } 
} 

Siempre emite una excepción de referencia nula y el punto de interrupción en el interior es NinjectWebCommon.cs nunca alcanzado, a diferencia de una aplicación web.

¿Qué más se debería hacer para que Ninject 3 funcione en un sitio web?

+0

Tenga en cuenta que se golpea el punto de interrupción porque el depurador se conecta demasiado tarde. Si escribe 'Debugger.Break()' antes de 'kernel.Bind <...> ... ', llegará a esa línea. – nebffa

Respuesta

10

Mi primer consejo es que ...

No utilice sitios Web ASP.NET. Olvida que existen Evítalos a toda costa. Son un retroceso anacrónico a los días de antaño que solo siguen aquí por razones heredadas.

Mi segundo consejo sería ...

Si insiste en continuar el uso de un proyecto de sitio Web, una fuerte inversión en medicina para el dolor, ya que lo necesita.

Mi tercer consejo sería ...

Ver primer consejo.

Mi cuarta pieza de consejo sería ...

Si usted no tiene absolutamente ningún control sobre si es o no es un proyecto de sitio Web o no, a continuación, se dan por vencidos en la idea de utilizar Ninject o cualquier otro DI envase. Los proyectos de sitios web heredan de un conjunto diferente de clases base que los sitios de aplicaciones web. No logrará que funcione de la misma manera, y probablemente pasará mucho tiempo tratando de hacerlo funcionar.

EDIT:

Básicamente, el modelo de código funciona de manera muy diferente entre los sitios web y aplicaciones web. No necesita buscar más allá del hecho de que las aplicaciones del sitio web no tienen espacios de nombres mientras que las aplicaciones de la aplicación web lo hacen. Esto debería decirle cuán enormemente diferentes son estos.

No estoy del todo seguro de que el proceso de activación funcione igual en ambos.

Sin embargo, habiendo dicho todo eso. Hay un problema flagrante con tu código. Su página deriva de System.Web.UI.Página en lugar de Ninject.Web.PageBase

+0

+1 para el humor. Por desgracia, sería difícil volver a escribir todas esas líneas de código heredado. – AFD

+0

@AndreiDrynov - Estaba hablando en serio. Los proyectos de sitios web son un infierno y te ponen muchas restricciones. Buena suerte. –

+0

Ya he usado esa máquina de medicina para el dolor de cabeza que mencionaste))) – AFD

1

Según la otra pregunta a la que se vinculó, necesita que su página herede de Ninject.Web.PageBase. Parece que su página hereda de System.Web.UI.Page, que no sabe cómo inyectar su repositorio dependiente.

+0

Eric, desafortunadamente, PageBase quiere ver NinjectHttpApplication , pero los sitios web no usan esa clase – AFD

+0

Entonces sospecho que no tiene suerte. Necesitas * algo * para conectar Ninject a tu página. –

Cuestiones relacionadas