Usando contêineres filhos do Castle Windsor para resolver um tipo com uma instância específica

Atualmente, estou usando a funcionalidade de contêiner filho de Castle Windsor para substituir o registro de um tipo específico por uma instância específica em um método de fábrica. Estou usando os contêineres filhos apenas para que o registro seja temporário para uma única resolução - em outras palavras, não quero que o registro afete todas as resoluções desse tip

Talvez algum código explique o que quero dize

Tenho um Func que funciona como uma fábricaFunc<IReportCategory, IReportCategoryViewModel> - Dou a implementação de uma IReportCategory e ela retorna uma nova instância de uma IReportCategoryViewModel. (IReportCategoryViewModel depende de IReportCategory).

Este é registrado no Castelo Windsor da seguinte forma:

        container.Register(
            Component.For<Func<IReportCategory, IReportCategoryViewModel>>().Instance(
                category => ResolveCategoryViewModelFactory(container, category)));

OndeResolveCategoryViewModelFactory é implementado da seguinte forma:

    private CategoryViewModel ResolveCategoryViewModelFactory(IWindsorContainer container, IReportCategory category)
    {
        using (IWindsorContainer childContainer = new WindsorContainer())
        {
            childContainer.Register(Component.For<IReportCategory>().Instance(category));
            container.AddChildContainer(childContainer);

            return childContainer.Resolve<IReportCategoryViewModel>();
        }
    }

O que o método acima alcança é a resolução do IReportCategoryViewModel, injetando a instância específica do IReportCategory como uma dependência. Se o IReportCategoryViewModel tiver outras dependências que precisam ser satisfeitas, elas serão injetadas automaticamente pelo contêine

Posteriormente, posso usar o Func da seguinte maneira:

public class Test
{
    private readonly Func<IReportCategory, IReportCategoryViewModel> factory;

    public Test(Func<IReportCategory, IReportCategoryViewModel> factory)
    {
        this.factory = factory;
    }

    public void ResolveTest()
    {
        // Create a category (note: this would probably be resolved from the container in some way)
        IReportCategory category = new ReportCategory();

        // Call into the factory to resolve the view model
        IReportCategoryViewModel vm = factory(category);
    }
    ...

Questão Parece uma coisa adequada a se fazer? Pela impressão que tenho, recipientes filhos não são recomendados em Castle Windsor - há outra maneira de obter o mesmo resultado?

Obrigado pela ajuda

questionAnswers(2)

yourAnswerToTheQuestion