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