2012-07-30 4 views

risposta

7

Sì, passare gli argomenti del costruttore in un'istanza di tipo anonimo; i nomi di proprietà devono corrispondere ai nomi dei parametri costruttore:

IColor desiredColor = //whatever 
int desiredNumber = //whatever else 
IFoo foo = container.Resolve<IFoo>(new { c = desiredColor, somenumber = desiredArgumentValue }); 

Se si utilizza una versione precedente di C# che non supporta i tipi anonimi (o anche se non sei), è possibile fare lo stesso con un dizionario :

IColor desiredColor = //whatever 
int desiredNumber = //whatever 
Dictionary<string, object> arguments = new Dictionary<string, object>(); 
arguments.Add("c", desiredColor); 
arguments.Add("somenumber", desiredNumber); 
IFoo foo = container.Resolve<IFoo>(arguments); 
+0

E il parametro IColor? – Darragh

+0

@Darragh Ho modificato la risposta per includere un argomento corrispondente. – phoog

17

si dovrebbe preferire Typed fabbrica invece di utilizzare il contenitore come servizio di individuazione. Basta definire l'interfaccia fabbrica:

public interface IFooFactory { 
    IFoo Create(int somenumber); 
} 

e registrarlo come fabbrica digitato:

container.Register(Component.For<IFooFactory>().AsFactory()); 

Quindi utilizzare l'iniezione di dipendenza per iniettare fabbrica e usarlo:

var foo = fooFactory.Create(desiredArgumentValue); 

Per maggiori informazioni read Windsor documentation

+0

Bella risposta. Significa che se uso questa fabbrica, devo sempre ricordare di rilasciare l'oggetto dopo averlo usato? Il documento dice "Ricorda che per impostazione predefinita tutti i componenti di Windsor sono singleton e che l'utilizzo di un contenitore di policy di rilascio predefinito fa riferimento a tutti i componenti, anche transienti. Ecco perché è importante rilasciare i componenti tramite factory digitato. componenti risolti tramite la funzione. " –

+0

Sì, è una buona pratica. È possibile definire il metodo 'void Destroy (componente IFoo)' sull'interfaccia di fabbrica per questo scopo, o implementare 'IDisposable' nel componente e disporlo. Quindi verrà rilasciato. –