2010-05-13 11 views
5

Obtuve algunas clases estáticas con métodos de extensión que agregan 'lógica de negocios' a las entidades que usan el patrón de repositorio.Cómo inyectar ninject en una clase estática con funciones de extensión

Ahora a veces necesito crear un nuevo IRepository en estas funciones de extensión.

Actualmente estoy trabajando en torno al entrar a mi kernel Ninject a través del objeto les extiendo, pero es muy feo:

public static IEnumerable<ISomething> GetSomethings(this IEntity entity) 
{ 
    using (var dataContext = entity.kernel.Get<IDataContext>()) 
     return dataContext.Repository<ISomething>().ToList(); 
} 

que también podría hacer un constructor estático, el acceso a la Ninject núcleo de alguna manera una fábrica, ¿hay infraestructura para eso en Ninject 2?

¿Alguien conoce una solución mejor? ¿Alguien tiene algunos comentarios sobre esta forma de implementar la lógica comercial?

Respuesta

4

Sobre el tema de los métodos de extensión y cómo obtienen cosas. Usted tiene dos enfoques:

  1. Servicio de Ubicación - tener un núcleo global y desplegables de Ubicación de servicio (que es diferente de la inyección de dependencias). El problema aquí es que aunque su entidad (o sus extensiones) no deben estar asumiendo su contexto y en su lugar exigiendo que

  2. medida que son un método de extensión de haber lo que está extendiéndose pase lo que necesita

Como has adivinado más o menos, esto (tener un kernel global que se convierte en el vertedero) es algo de lo que Ninject intenta disuadirte. En general, la extensión para lo que esté usando (por ejemplo, MVC o WCF) proporcionará algo si es apropiado. Por ejemplo, la extensión WCF tiene http://github.com/ninject/ninject.extensions.wcf/blob/master/source/Ninject.Extensions.Wcf/NinjectServiceHost.cs

El problema más grande aquí es que las dependencias como esta probablemente no se propaguen al nivel Entidad - debe permanecer en el nivel de Servicio y propagarse desde allí (usando el vocabulario DDD).

Usted puede encontrar this answer by me interesante, ya que cubre esta planta un poco (más de unas técnicas ninject que un punto de vista arquitectónico conceptos)

+0

, gracias por su respuesta. Tampoco soy muy aficionado a la ubicación del servicio, en mi opinión es incluso más feo lo que estoy haciendo ahora. Iré con el problema más grande aquí, que este no es el lugar correcto para agregar lógica comercial. Tenía la esperanza de que hubiera alguna forma mágica de inyectar un constructor estático. Así que podría mantener mi diseño y no hacerlo demasiado feo. Mantendré la pregunta abierta durante unas pocas horas y si no aparece ningún genio de AOP, ¡aceptaré su respuesta! – JJoos

+0

Aquí no encontrarás genios, solo personas que buscan respuestas en los foros, están todos en la lista de correo de Ninjecxt: D En la parte inferior de la línea están los métodos estáticos [como los métodos de extensión], que no hay contexto u oportunidad para interceptar de manera fácil. Es posible hacer fluir el contexto dentro de la Entidad en el punto de 'new'ing de varias maneras (NHibernate y L2S tienen cada uno su propio modo). El problema es que no quieres que las entidades tomen el asunto en sus propias manos y busquen en otros repositorios sin querer. Y la eficiencia también sufrirá, a menos que vaya por una ruta tipo Hiro. –

+0

El libro de Evans DDD (una lectura obligada no importa lo que hagas, incluso si te duele un poco la cabeza para absorberlo) y/o http://thinkddd.com/ realmente te ayudará a pensar a través de tu diseño general aquí .Si realmente está buscando cosas pesadas de AOP, lo encontrará en P en la dirección de PostSharp. –

Cuestiones relacionadas