【发布时间】:2011-11-10 19:25:56
【问题描述】:
我目前正在使用 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);
}
...
问题:这看起来是否合适?从我得到的印象来看,温莎城堡不推荐使用子容器——还有其他方法可以达到同样的效果吗?
感谢您的帮助。
【问题讨论】:
标签: dependency-injection castle-windsor