Использование дочерних контейнеров Castle Windsor для разрешения типа с конкретным экземпляром
В настоящее время я использую функциональность дочернего контейнера Castle Windsor, чтобы переопределить регистрацию определенного типа конкретным экземпляром в фабричном методе. Я использую дочерние контейнеры исключительно для того, чтобы регистрация была временной для одного разрешения - иными словами, я не хочу, чтобы регистрация влияла на все разрешения для этого типа.
Возможно, какой-то код объяснит, что я имею в виду.
У меня есть Func, который действует как фабрикаFunc<IReportCategory, IReportCategoryViewModel>
- Я даю ему реализацию IReportCategory, и он возвращает новый экземпляр IReportCategoryViewModel. (IReportCategoryViewModel зависит от IReportCategory).
Это зарегистрировано в замке Виндзор следующим образом:
container.Register(
Component.For<Func<IReportCategory, IReportCategoryViewModel>>().Instance(
category => ResolveCategoryViewModelFactory(container, category)));
гдеResolveCategoryViewModelFactory
реализован следующим образом:
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>();
}
}
Достигнутый выше метод достигает разрешения IReportCategoryViewModel, внедряющего конкретный экземпляр IReportCategory в качестве зависимости. Если у IReportCategoryViewModel есть другие зависимости, которые должны быть удовлетворены, контейнер автоматически вводит их.
Впоследствии я могу использовать Func следующим образом:
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);
}
...
Вопрос: Это похоже на подходящую вещь? Судя по моему впечатлению, в Castle Windsor дочерние контейнеры не рекомендуются - есть ли другой способ достижения того же результата?
Спасибо за вашу помощь.