2013-05-08 30 views
8

Próbowałem naprawić ten problem przez dłuższy czas i nadal nie jestem mądrzejszy. Mam następujące metody:Zamek Windsor rozwiązuje w czasie wykonywania

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

Kod Mam problemy z obejmuje wartości zwracanych którego jestem newing up, które idealnie Chciałbym wyjechać do zamku Windsor do czynienia. Więc, co ja wtedy nie było stworzenie 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"); 
    } 
} 

i mój Parse metoda staje się teraz:

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

Co mam dużo błąd jest, jak to zrobić Rejestracja i dynamicznie przechodzić w parametrach ponieważ konstruktor CreateReportResult jest:

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

Więc pytanie brzmi jak mogę skonfigurować kod rejestracyjny w moim WindsorContainer instalatora i jak mogę potem pa ss w wymaganych parametrach? Używam Castle Windsor 3.2.

Oto kod mam w rejestracji:

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

Odpowiedz

5

myślę należy szukać w zakładzie w Windsor typed factory. Parametry są przekazywane, o ile mają taką samą nazwę w implementacji, jak w rejestracji.

+0

Witaj Martin, natknąłem się na maszynę do pisania, ale nie wiem, jak jej użyć do moich celów, ponieważ nie wiem, jak poprawnie wykonać rejestrację. Zaktualizowałem mój OP, aby pokazać, co mam. – DavidS

+0

Podstęp polega na tym, że domyślna fabryka nie wymaga implementacji. Aby rozwiązać problem z twoim komponentem za pomocą parametru int amountoferrors, musisz zaimplementować ITypedFactoryComponentSelector zgodnie z opisem w powyższym linku. Tam możesz zwrócić nazwę komponentu, który chcesz rozwiązać na podstawie informacji o metodzie i parametrze przekazywanym. Jeśli potrzebujesz więcej parametrów przekazanych w celu utworzenia wystąpienia, wtedy podpis fabryki musi się odpowiednio zmienić. (wszystkie parametry muszą zostać przekazane do fabryki). – Martin

+2

Dzięki za wyjaśnienie Martin. Dla wszystkich zainteresowanych tym, jak to zrobiłem, napisałem na blogu o tym http://davidsiew.wordpress.com/2013/05/08/castle-windsor-typed-factory-resolving-dependencies-at-runtime/. – DavidS

Powiązane problemy