2011-05-18 20 views
5

Bir sistem tepsisi yardımcı programı yazıyorum ve menüden uygulama için açabileceğiniz birkaç farklı form var. Gerekirse bu formların oluşturulmasını çözmek için autofac kullanıyorum. Func ve Func bağımlılıkları ana formumda. Tek bir (Modal olmayan) formun bir örneğini, bu form atılana kadar çözmek için autofac'ı nasıl kullanırım?

kullanıcı zaten o odak almalıdır gösteriliyorsa, formu aktive bir seçeneği seçerse

, aksi AutoFac yeni bir form oluşturması gerekir.

Gerçekten onlar kullanımda değilken bu formlar bellekte oturan, bu yüzden kullanıcı bunu kapandığında Şu anda kendisinin formu bertaraf izin veriyorum istemiyoruz. Bilmem gereken ne

böylece formu tanzim edildiğini AutoFac bildirebilir nasıl:

  1. Artık tanzim forma bir başvuru içeriyor (ve böylece çöp toplanabilir)
  2. Sonraki formun bir örneği için autofac istendiğinde, yeni bir tane oluşturur.

Autofac wiki'yi okuyorum ve sanırım sadece LifetimeScope'u düzgün ayarlamanız gerektiğini düşünüyorum. Yaptığın şey

cevap

4

yüzden AutoFac standart lifetimescopes geçerli sanmıyorum norm dışında küçük olduğunu. Benzer bir senaryoya sahibim ki, değiştirilebilen/yeniden yüklenebilen bir tür tek bir örnek istiyorum. Yaptığım şey bir sarmalayıcı sınıfını kaydetmekti.

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(); 
    } 
} 

Sonra

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

Teşekkür Jim kayıt olabilirsiniz ... gibi bir şey, bir Winform için olurdu uyarlanması, bir [açık genel] (http olarak biçim sağlayıcı kaydettirerek çözüm üzerinde genişletilmiş : //code.google.com/p/autofac/wiki/OpenGenerics) ve form bağımlılıklarım için bir arayüz kullanıyorum. Bu form arayüzlerine erişmek için hizmetler oluşturmak için, autofac tarafından çözümlenen bir form sağlayıcısı kullanmıştım. Bu şekilde formlarım Autofac kayıt kodumu değiştirmeme gerek kalmadan bağımlılıklar ekleyebilir. –

+0

@RhysParry sana ilham bana ve diğerleri için kaynak kodunu yayınlayarak tercihen uzatılmış çözümü üzerinde durmak için sorabilir miyim? :) – bernhof

İlgili konular