Autofac documento oficial en inglés - un componente registrado --1 concepto registrada

Los documentos oficiales: http: //docs.autofac.org/en/latest/register/registration.html

En primer lugar, el concepto de registro

  componente de registro Uso Autofac, mediante la creación de un ContainerBuilder e informar constructor de qué servicio público que los componentes.

  Componentes de reflexión (por el registro de un tipo particular o genéricos .net abiertas) la creación, la creación proporcionando instancia ya hecho (una instancia de objeto que ha creado); o creados por la expresión lambda. ContainerBuilder una serie de método de Registro () que le permite alcanzar estos valores.

  Mediante el uso de método que en () de ContainerBuilder, cada componente da a conocer en uno o más servicios.

Copiar el código
// crear el contenedor de componente / servicio registrada 
var = new nuevo ContainerBuilder Builder (); 

// tipo de registro da a conocer Interface 
builder.RegisterType <ConsoleLogger> () de Como <ILogger> () ;. 

// Registro se crea una instancia de objeto 
de salida var = StringWriter nuevo nuevo (); 
builder.RegisterInstance (la salida) la .as <TextWriter> (); 

// expresión ejecución registrada crea un objeto 
builder.Register (c => new ConfigReader ( "MySection")) Como <IConfigReader> (). ; 

// compilar completar el contenedor registro y preparación objetos de análisis sintáctico 
var = contenedor builder.Build (); 

.. // ahora se puede utilizar el servicio de resolución Autofac por ejemplo, se está a punto de realizar el registro de una expresión lambda para el servicio IConfigReader 
usando (alcance var = contenedor .BeginLifetimeScope ()) 
{ 
  var Lector = container.Resolve <IConfigReader> (); 
}
Copiar el código

 

1, el conjunto reflectante

1.1 Por tipo de registro

Componente generado por el tipo de reflexión es generalmente registrada por:
constructor var = nuevo ContainerBuilder (); 
builder.RegisterType <ConsoleLogger> (); 
builder.RegisterType (typeof (ConfigReader));

Cuando se utiliza un componente de reflexión, Autofac automáticamente para su clase, el constructor tiene la mayoría de los parámetros coincidentes, este parámetro puede ser obtenida a partir del recipiente.

Por ejemplo, usted tiene una clase con tres constructores:

MyComponent public class 
{ 
    MyComponent pública () {/ * ... * /} 
    MyComponent pública (ILogger registrador) {/ * ... * /} 
    MyComponent pública (ILogger registrador, IConfigReader lector) {/ * ... * /} 
}

Ahora, componentes y servicios registrados en su contenedor:

Copiar el código
constructor var = nuevo ContainerBuilder (); 
builder.RegisterType <MyComponent> (); 
. builder.RegisterType <ConsoleLogger> () Como <ILogger> (); 
contenedor var = builder.Build (); 

usando (alcance var = container.BeginLifetimeScope ()) 
{ 
  componente var = container.Resolve <MyComponent> (); 
}
Copiar el código

Al analizar sus componentes, Autofac se encuentra ya registrado ILogger, pero IConfigReader no han sido registrados. En este caso, se seleccionará el segundo constructor, porque tiene la más grande es un parámetro constructor se puede encontrar en el recipiente.

Tenga en cuenta que en base a los componentes reflejados: Tipo de componente RegisterType debe ser registrado por un tipo particular. Mientras que los componentes se pueden hacer clases e interfaces abstractas públicas como un servicio, pero no se puede registrar una abstractos componentes de clase / interfaz. Si se piensa en que tiene sentido: Dentro Autofac, Autofac crear una instancia de objeto que se registre. No se puede ser una nueva clase abstracta o una interfaz. Debe tener una implementación de la misma.

1.2 Especificar un constructor

Puede seleccionar manualmente un constructor específico, y la cubierta se utiliza para seleccionar automáticamente registrar conjunto de constructor, y un conjunto de métodos que utilizan parámetro de tipo UsingConstructor indicando los constructores de tipo:

builder.RegisterType <MyComponent> () 
       .UsingConstructor (typeof (ILogger), typeof (IConfigReader));

Tenga en cuenta que al analizar, sigue siendo necesario para proporcionar los parámetros necesarios, de lo contrario un error al intentar resolver el aparece objeto. Puede pasar parámetros al registrar o pasar parámetros al analizar.

2, los ejemplos del componente

A veces, es posible que desee para generar primer ejemplo de un objeto, y añadirlo al contenedor para el componente para inscribirse. Puede hacerlo utilizando el RegisterInstance método:

salida var = new StringWriter (); 
builder.RegisterInstance (salida) .Como <TextWriter> ();

Al hacer algunas cosas a considerar, componente de liberación proceso de inscripción automática Autofac, o usted quiere controlar su ciclo de vida en lugar de llamar Autofac Desechar para usted en su objeto. En este caso (que desea controlar el ciclo de vida), es necesario utilizar el método para registrar ejemplo ExternallyOwned:

salida var = new StringWriter (); 
builder.RegisterInstance (salida) 
       .Como <TextWriter> () 
       .ExternallyOwned ();

Cuando Autofac integrado en una aplicación existente (instancia singleton ya existe una necesidad y el uso como un componente en un recipiente), que también proporciona ejemplos de registro práctico, estos componentes no directamente relacionados con una sola realización de la , que pueden ser registrados en un recipiente como un ejemplo:

builder.RegisterInstance (MySingleton.Instance) .ExternallyOwned ();

Esto asegurará que singleton estático puede ser eliminado con el tiempo y reemplazado por una gestión de contenedores.

El servicio por defecto se da a conocer a modo de ejemplo de un tipo particular. Ver "servicios y componentes" a continuación.

3, expresiones lambda conjunto

Para la reflexión creación de componentes es una muy buena opción por defecto. Cuando se crea un componente lógico no es sólo una simple llamada al constructor, las cosas van a causar problemas.

Autofac para aceptar una expresión delegado o lambda se utiliza para crear los componentes:

builder.Register (c => new A (c.Resolve <B> ()));

Expresión parámetro c se proporciona un componente de contexto (un objeto IComponentContext), donde se crea el montaje. Se puede utilizar para resolver otros componentes del contenedor para ayudarle a crear componentes. Es importante utilizar, en lugar de un cierre para acceder al contenedor, por lo que el apoyo correcto y contenedores a la medida de limpieza.

Use dependencias parámetro de contexto adicionales pueden usarse - en este caso, A es necesario el parámetro constructor de tipo B, puede tener dependencias adicionales.

Los servicios proporcionados por componente de expresión creada por defecto es la expresión inferido tipo de retorno.

Estos son algunos ejemplos de la demanda creada por el componente reflejada es muy torpe, pero por la expresión lambda es muy agradable de tratar.

  • Los parámetros complejos
Los parámetros del constructor no siempre son una sencilla declaración de valor constante. valores de configuración XML sin necesidad de utilizar algún tipo de estructura gramatical, utilizando el código:
builder.Register (c => new UserSession (DateTime.Now.AddMinutes (25)));

Por supuesto, es posible que desee especificar la sesión expira algo en el archivo de configuración. 

  • inyección propiedades
Aunque Autofac proporcionar una inyección propiedad de primera clase, también puede utilizar expresiones de inicialización y atributos para llenar características:
builder.Register (c => new A () {myb = c.ResolveOptional <B> ()});

Este ResolveOptional método trata de resolver los valores, pero si el servicio no se ha registrado, no se producirá una excepción. (Usted recibirá una excepción si el servicio se ha registrado pero la propiedad no ha sido resuelto). Esta es una forma de resolver el servicio.

No se recomienda para la inyección uso de la propiedad en la mayoría de los casos. Alternativamente modo de objeto nulo, volver a cargar el constructor valores por defecto o un parámetro de constructor puede crear un limpiador, "cambio" componentes pueden ser la inyección de dependencia constructor usado.
  • Una implementación (Selección de una implementación por valor de parámetro) Parámetro de valores seleccionando
componentes separados para crear la mayor ventaja es el tipo específico puede cambiar, que es por lo general se realiza en marcha, y no sólo cuando se configura:
Copiar el código
builder.Register <CreditCard> ( 
  (c, p) => 
    { 
      var accountId = p.Named <string> ( "accountId"); 
      si (accountId.StartsWith ( "9")) 
      { 
        return new GoldCard (accountId); 
      } 
      otra cosa 
      { 
        return new StandardCard (ID de cuenta); 
      } 
    });
Copiar el código

En este ejemplo, CreditCard dos clases implementan, GoldCard y  StandardCardque depende de una instancia de la clase para proporcionar el tiempo de ejecución accountId.

En este ejemplo, el método de crear el segundo parámetro proporcionado por el parámetro p.

Utilice el siguiente código para registrarse:

tarjeta var = container.Resolve <CreditCard> (nuevo NamedParameter ( "accountId", "12345"));
Si crea un delegado CreditCard declaración de instancia y una fábrica de delegado, puede obtener un tipo limpio, seguro de la sintaxis. 

4, los componentes comunes revelados (Open componentes genéricos)

 

apoyo Autofac abierta tipo genérico, utilice RegisterGeneric () constructor:

 

builder.RegisterGeneric (typeof (NHibernateRepository <>)) 
       .Como (typeof (IRepository <>)) 
       .InstancePerLifetimeScope ();
Cuando las necesidades de contenedores para escribir un servicio de búsqueda, autofac se asignará a un equivalente de cerca de lograr el tipo de versión.
// Autofac devolverá un NHibernateRepository <> tarea 
tareas var = container.Resolve <IRepository <Tarea >> ();
Tipo de propiedad de servicio (por ejemplo IRepository <persona>) el registro volverá a escribir la versión genérica.

5, servicios y componentes (Servicios) Componentes vs.

Cuando se registra componentes, que debe contar el componente autofac servicio público, por defecto, a sí mismos registrada sólo los más públicamente como el tipo de registro.
// Esto expone el servicio "CallLogger" 
builder.RegisterType <CallLogger> ();

Los componentes sólo se puede resolver sus servicios públicos, en este ejemplo sencillo, que significa:

// Este trabajo, debido a que las reuniones públicas por defecto de este tipo 
scope.Resolve <CallLogger> (); 

// esto no va a funcionar, porque no hemos registrado ni divulgar ILogger interfaces de 
scope.Resolve <ILogger> ();
Se puede utilizar cualquier número de componente de servicio público.
builder.RegisterType <CallLogger> () 
       .Como <ILogger> () 
       .Como <ICallInterceptor> ();
Una vez que un servicio público, puede resolver los servicios basados ​​en componentes. Nótese, sin embargo, una vez que se abre como un componente de un determinado servicio, el servicio predeterminado (tipo de componente) se cubrirá:
// estos trabajos voluntad, porque abrimos un servicio correspondiente en el registro 
scope.Resolve <ILogger> (); 
scope.Resolve <ICallInterceptor> (); 

// Esto no va a funcionar, porque hemos desarrollado un especial reescribir el servicio de componente 
scope.Resolve <CallLogger> ();
Si desea abrir un componente es un conjunto de servicios y el uso del servicio por defecto, puede utilizar el método AsSelf:
builder.RegisterType <CallLogger> () 
       .AsSelf () 
       .Como <ILogger> () 
       .Como <ICallInterceptor> ();

Ahora, todo lo cual va a funcionar:

// Estos hará todo el trabajo, ya expusimos 
// los servicios apropiados en el registro: 
scope.Resolve <ILogger> (); 
scope.Resolve <ICallInterceptor> (); 
scope.Resolve <CallLogger> ();

6, el registro por defecto (por defecto Las inscripciones)

Si hay varios componentes con un servicio público, autofac utilizarán el componente final registrado como el proveedor de servicios predeterminado:
. builder.Register <ConsoleLogger> () Como <ILogger> (); 
. builder.Register <FileLogger> () Como <ILogger> ();

En este caso se FileLogger proveedor de ILogger como el servicio por defecto, ya que se registró por última vez.

Con el fin de derrocar este caso, se puede utilizar el  PreserveExistingDefaults()método de modificar:

. builder.Register <ConsoleLogger> () Como <ILogger> (); 
builder.Register <FileLogger> () Como <ILogger> () PreserveExistingDefaults ()..;
En este caso, el proveedor ConsoleLogger se ILogger como el servicio por defecto, porque la última FileLogger registrada utilizada PreserveExistingDefaults ().
 

7, el registro de configuración (Configuración de Registros)

Puede configurar "módulos" para proporcionar un conjunto de registro de inscripción o cambiar en tiempo de ejecución usando XML o de programación. módulos autofac se pueden usar para generar o proporcionar dinámica lógica registro de condición de registro.

8, proporcionan el registro dinámico (dinámicamente Proporcionada Registros)

autofac módulos para el registro dinámico introdujeron lógica es la forma más fácil. Se puede utilizar al analizar un módulo de añadir dinámicamente una instancia de registro log4net como un servicio,
Si necesita más características dinámicas, tales como la adición de un nuevo tipo de apoyo implícito relación, es posible que desee utilizar conceptos avanzados comprobar la parte fuente de registro.

Supongo que te gusta

Origin www.cnblogs.com/nimorl/p/12626452.html
Recomendado
Clasificación