2013-05-08 31 views
8

Ho cercato di risolvere questo problema per un po 'di tempo e non ne sono ancora più saggio. Ho avuto il seguente metodo:Castle Windsor Resolve in fase di esecuzione

public IResult Parse(string[] args) 
{ 
    var argumentOption = new ArgumentOption(_dataModelBinder); 
    var boundArgumentOption = argumentOption.Bind(args); 

    var bindingResults = boundArgumentOption.Validate(_argumentOptionValidator); 

    // AREA OF INTEREST 
    if (bindingResults.Any()) 
    { 
     return new ErrorResult(); 
    } 

    return new CreateReportResult(
     _resultActioner 
     , boundArgumentOption.OutputFilePath 
     , boundArgumentOption.PatientId 
     , "database"); 
} 

Il codice che sto avendo problemi con coinvolge i valori di ritorno di cui sono Newing up, che idealmente mi piacerebbe lasciare al castello di Windsor a che fare. Allora, che cosa poi ho fatto è stato quello di creare un Abstract Factory:

public interface IResultFactory 
{ 
    IResult Create(int numOfErrors); 
} 

public class ResultFactory : IResultFactory 
{ 
    private readonly IWindsorContainer _container; 

    public ResultFactory(IWindsorContainer container) 
    { 
     _container = container; 
    } 

    public IResult Create(int numOfErrors) 
    { 
     if (numOfErrors > 0) 
     { 
      return _container.Resolve<IResult>("ErrorResult"); 
     } 

     return _container.Resolve<IResult>("CreateReportResult"); 
    } 
} 

e il mio metodo Parse diventa ora:

public IResult Parse(string[] args) 
{ 
    var argumentOption = new ArgumentOption(_dataModelBinder); 
    var boundArgumentOption = argumentOption.Bind(args); 

    var bindingResults = boundArgumentOption.Validate(_argumentOptionValidator); 

    IResult result = _factory.Create(bindingResults.Count()); 

    return result; 
} 

Quello che sto avendo una grande quantità di problemi con è come fare il registrazione e dinamicamente passare nei parametri perché il costruttore per CreateReportResult è:

public CreateReportResult(IResultActioner resultActioner, Uri filePath, string patientId, string dataSource) 

quindi la domanda è: come faccio a impostare il mio codice di registrazione nella mia installazione WindsorContainer e come faccio poi pa ss nei parametri richiesti? Sto usando Castle Windsor 3.2.

Ecco il codice che ho nella mia registrazione:

container.Register(
    Component 
    .For<IResult>() 
    .ImplementedBy<ErrorResult>() 
    .Named("ErrorResult") 
    .LifeStyle.Transient 
    , Component.For<IResultFactory>() 
    .AsFactory() 
); 

container.Register(
    Component 
    .For<IResult>() 
    .ImplementedBy<CreateReportResult>() 
    .Named("CreateReportResult") 
    .LifeStyle.Transient 
    , Component.For<IResultFactory>() 
    .AsFactory() 
); 

risposta

5

penso che si dovrebbe essere alla ricerca presso l'impianto typed factory a Windsor. I parametri vengono passati insieme, purché abbiano lo stesso nome nell'implementazione come nella registrazione.

+0

Ciao Martin, mi sono imbattuto nella fabbrica battuta a macchina ma non riesco a capire come usarlo per i miei scopi perché non so come fare correttamente la registrazione. Ho aggiornato il mio OP per mostrare quello che ho. – DavidS

+0

Il trucco è che la fabbrica tipizzata non richiede per impostazione predefinita un'implementazione. Per risolvere il tuo componente con il parametro int amountoferrors è necessario implementare ITypedFactoryComponentSelector come descritto nel link sopra. Qui è possibile restituire il nome del componente che si desidera risolvere in base al metodoinfo e ai parametri passati. Se sono necessari più parametri passati per creare un'istanza, la firma della fabbrica deve essere modificata di conseguenza. (tutti i parametri devono essere passati alla fabbrica). – Martin

+2

Grazie per la spiegazione Martin. Per chiunque sia interessato a come sono andato su questo, ho scritto blog su questo http://davidsiew.wordpress.com/2013/05/08/castle-windsor-typed-factory-resolving-dependencies-at-runtime/. – DavidS

Problemi correlati