2009-11-20 23 views
5

Autofac için belge, delegate factories otomatik olarak oluşturma yeteneğini açıklayan ilginç bir sayfaya sahiptir. Aynı zamanda Autofac kullanmadan benzer sonuçları el ile yazarak almanızı şiddetle tavsiye eder.Delege fabrikasını nasıl uygularım?

IoC için Unity kullanıyorum ve kapsayıcıyı başka nesneler oluşturması gereken nesnelerin etrafından geçirmekten kaçınmak istiyorum, bu nedenle Autofac olmadan bir temsilci fabrikayı nasıl yazardınız?

cevap

6

Şimdiye kadar hiç Unity kullanmamıştım, bu yüzden cevabım oldukça belirsiz.

Müdür basittir. Fabrikaları temsil eden bazı delegeleri tanımlarsınız. Ardından delegelerle eşleşen genel yöntemlere sahip bir "fabrika" sınıfı oluşturursunuz. Bu sınıf konteyneri bilir. Şimdi delegeyi kaydettirin ve bu sınıfı uygulama olarak ayarlayın. Daha sonra sadece delege enjekte edebilirsiniz. Enjekte edilen delege çağırdığınızda, kapsayıcıyı bilen ve yeni bir örnek için kapsayıcıdan soran fabrika sınıfı çağrılır.

Önce fabrika-delegelerinizi tanımlarsınız. Bu gibi temsilci kayıt neyi Şimdi

/// <summary> 
/// Represents a <see cref="Provider{TArg,TServiceType}"/> which holds 
/// the container context and resolves the service on the <see cref="Create"/>-call 
/// </summary> 
internal class GenericFactory{ 
    private readonly IContainer container; 

    public ClosureActivator(IContainer container) 
    { 
     this.container= container; 
    } 

    /// <summary> 
    /// Represents <see cref="Provider{TServiceType}.Invoke"/> 
    /// </summary> 
    public TService Create() 
    { 
     return container.Resolve<TService>(); 
    } 
    /// <summary> 
    /// Represents <see cref="Provider{TArg,TServiceType}.Invoke"/> 
    /// </summary> 
    public TService Create(TArg arg) 
    {   
     return container.Resolve<TService>(new[] {new TypedParameter(typeof (TArg),arg)}); 
    } 
} 

şey:

public delegate TServiceType Provider<TServiceType>(); 
public delegate TServiceType Provider<TArg,TServiceType>(TArg argument); 

bir jenerik fabrika oluşturmak

var newServiceCreater = new GenericFactory(container); 
container.Register<Provider<MyCompoent>>().To(newServiceCreater.Create); 

var newServiceCreater = new GenericFactory(container); 
container 
    .Register<Provider<OtherServiceWithOneArgumentToConstruct>>() 
    .To(newServiceCreater.Create); 

diğer bileşenler sadece 'Sağlayıcı Şimdi diğer enjekte 'konteyner yerine.

+0

Bu işe başladım - çok teşekkürler! – GraemeF

İlgili konular