2011-05-18 8 views
5

Estoy escribiendo una utilidad de bandeja del sistema y en el menú hay varios formularios diferentes que puede abrir para la aplicación. Estoy usando autofac para resolver la creación de estos formularios cuando sea necesario dando mi forma principal de dependencias de Func y Func.¿Cómo uso autofac para resolver una instancia única de un formulario (no modal) hasta que se elimine ese formulario?

Si el usuario selecciona una opción que activa el formulario, si ya se muestra, debería recibir el foco, de lo contrario, autofac debería crear un formulario nuevo.

Realmente no quiero que estos formularios estén guardados en la memoria mientras no estén en uso, por lo que actualmente estoy dejando que el formulario se elimine solo cuando el usuario lo cierra.

Lo que necesito saber es cómo puedo notificar a autofac que el formulario se ha dispuesto de manera que:

  1. Ya no contiene una referencia a la forma dispuesta (y puede así ser basura recogida)
  2. Cuando vuelva a solicitar autofac para una instancia del formulario, crea uno nuevo.

He estado leyendo el wiki de Autofac y supongo que solo tengo que configurar el LifetimeScope correctamente.

Respuesta

4

Lo que está haciendo está un poco fuera de lo normal, así que no creo que se apliquen los tiempos de vida estándar de Autofac. Tengo un escenario similar en el que tengo un tipo en el que quiero una sola instancia de un tipo reemplazable/recargable. Lo que hice fue registrar una clase contenedora. Adaptarse a un Winform, sería algo como ...

public class SingletonFormProvider<TForm> : IDisposable 
    where TForm: Form 
{ 
    private TForm _currentInstance; 
    private Func<TForm> _createForm; 

    public SingletonFormProvider(Func<TForm> createForm) 
    { 
     _createForm = createForm; 
    } 

    public TForm CurrentInstance 
    { 
     get 
     { 
       if (_currentInstance == null) 
        _currentInstance = _createForm(); 

       // TODO here: wire into _currentInstance close event 
       // to null _currentInstance field 

       return _currentInstance; 
     } 
    } 

    public void Close() 
    { 
     if (_currentInstance == null) return; 

     _currentInstance.Dispose(); 
     _currentInstance = null; 
    } 

    public void Dispose() 
    { 
     Close(); 
    } 
} 

entonces se puede inscribir

builder 
    .Register(c => new SingletonFormProvider<YourForm>(() => new YourForm()) 
    .AsSelf() 
    .SingleInstance(); 
builder 
    .Register(c => c.Resolve<SingletonFormProvider<YourForm>>().CurrentInstance) 
    .AsSelf(); 
+1

Gracias Jim, me ampliado en su solución mediante el registro del proveedor de formularios como [abierta genérica] (http : //code.google.com/p/autofac/wiki/OpenGenerics) y utilizando una interfaz para mis dependencias de formulario. Para crear los servicios para acceder a estas interfaces de formulario, les pedí que utilizaran un proveedor de formulario resuelto por autofac. De esta forma, mis formularios pueden agregar dependencias sin que tenga que modificar mi código de registro de Autofac. –

+0

@RhysParry ¿Podría pedirle que amplíe la solución extendida, preferiblemente publicando el código fuente para que yo y otros se inspiren? :) – bernhof

Cuestiones relacionadas