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