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