6

me miraba esto y que responde a la mitad de mis preguntas:castillo de Windsor interna Constructor/Clase

Castle Windsor: Register class with internal constructor?

Pero puede usar Windsor a utilizar constructores interna/clase, junto con la inyección de dependencia? (Entonces los parámetros del constructor se inyectan también)? Me gustaría mantener la clase/constructor interno para permitir una encapsulación óptima (estas clases no deberían exponerse al público).

Necesito esto para apoyar Silverlight, así que no creo que esto es una opción:

Castle Windsor: How to register internal implementations

Gracias.

+0

En mi humilde opinión esto no es una encapsulación óptima. Si necesita que Windsor acceda a estas clases, entonces no están encapsuladas adecuadamente. O escribe una fachada o hazla pública. –

+1

No estoy seguro de entender. Tengo una interfaz pública de servicio IMyService. No quiero que la implementación sea visible para los consumidores del servicio. Así que tengo la clase de implementación interna MyService: IMyService. ¿Cómo este escenario no representa la encapsulación óptima? – Jeff

+0

está confundiendo tipos internos con interfaces. Estos son problemas ortogonales. –

Respuesta

6

Puede que esta no sea una respuesta satisfactoria, pero es una práctica recomendada crear todas las clases que necesita para crear una instancia a través de Castle public, con constructores públicos. Su diseño debería permitir una dependencia posterior para crear instancias de sus objetos sin depender de Castle o InternalsVisibleTo.

Para su pregunta, Castle solo buscará constructores públicos para instanciar un objeto. No creo que haya una forma de hacerlo buscar constructores internos o privados. Sin embargo, si su clase es interna, puede hacer que sus constructores internos sean públicos sin cambiar la encapsulación. Consulte el siguiente caso de prueba:

[TestFixture] 
public class InternalConstructorTests 
{ 
    [Test] 
    public void Test() 
    { 
     using (var container = new WindsorContainer()) 
     { 
      container.Register(
       Component.For<IFoo>().ImplementedBy<Foo>(), 
       Component.For<IBar>().ImplementedBy<Bar>(), 
       Component.For<IBaz>().ImplementedBy<Baz>() 
       ); 
      // fails because Castle can't find, and won't call, the internal constructor 
      Assert.Throws<ComponentActivatorException>(()=>container.Resolve<IFoo>()); 
      // passes because the Baz constructor is public, but the "real" encapsulation 
      // level is the same because the class is internal, effectively making the 
      // public constructor internal as well 
      container.Resolve<IBaz>(); 
     } 
    } 
} 
internal interface IBar{} 
internal class Bar : IBar{} 
internal interface IFoo{} 
internal class Foo : IFoo 
{ 
    internal Foo(IBar bar) 
    { 
    } 
} 
internal interface IBaz { } 
internal class Baz : IBaz 
{ 
    public Baz(IBar bar) 
    { 
    } 
} 
Cuestiones relacionadas