考虑下面的类:Windsor如何为每个解析调用创建一个组件?
public interface IView
{
/// <summary>
/// Ignore this (its only for the assertion)
/// </summary>
ITask Task { get; }
}
public class ViewA : IView
{
private readonly ITask _task;
public ViewA(ITask task)
{
_task = task;
}
public ITask Task
{
get { return _task; }
}
}
public class ViewB : IView
{
private readonly ITask _task;
public ViewB(ITask task)
{
_task = task;
}
public ITask Task
{
get { return _task; }
}
}
public class ViewManager
{
private readonly List<IView> _views;
public ViewManager(IView[] views)
{
_views = new List<IView>(views);
}
public ReadOnlyCollection<IView> Views
{
get { return new ReadOnlyCollection<IView>(_views); }
}
}
最后我试图做到:
[Fact]
public void Configure_TwoServicesWithDependencyToTransientComponent_BothShareComponent()
{
// arrange
var windsorContainer = new WindsorContainer();
windsorContainer.Kernel.Resolver.AddSubResolver(new ArrayResolver(windsorContainer.Kernel));
windsorContainer.Register(Component.For<ITask>()
.ImplementedBy<TaskWithNoDependencies>()
.Named("task")
.LifeStyle.Transient);
windsorContainer.Register(Component.For<IView>().ImplementedBy<ViewA>().LifeStyle.Transient);
windsorContainer.Register(Component.For<IView>().ImplementedBy<ViewB>().LifeStyle.Transient);
windsorContainer.Register(Component.For<ViewManager>()
.LifeStyle.Transient);
// act
ViewManager service = windsorContainer.Resolve<ViewManager>();
// assert
Assert.Same(service.Views[0].Task, service.Views[1].Task);
}
我怎样才能让温莎创建一个实例的ITask因此多数民众赞成它由ViewA和ViewB解决时共享ViewManager?我尝试以下,但它没有工作:
windsorContainer.Register(Component.For<ViewManager>()
.DynamicParameters((k, d) =>
{
d["task"] = k.Resolve<ITask>();
})
.LifeStyle.Transient);
这是一个winforms应用程序,我没有任何静态web请求上下文或任何东西来绑定它。上下文边界通过解析“AnotherServiceWithTaskDependency”来定义。我可以访问最新版本的Windsor,所以请告诉我干净的解决方案:-) – Marius 2010-07-08 17:19:53
好吧,但为什么它是一个上下文边界?你想在这两个对象之间共享一个实例,而不是在其他对象之间共享一个实例的原因是什么?它们之间的关系是什么? – 2010-07-08 21:46:37
我有一个“视图管理器”,它将“视图”列表作为输入参数。 “意见”必须分享一些组成部分,因为他们必须对彼此之间的变化作出反应。两个不同“ViewManagers”中的“视图”不应共享前面提到的组件。因此解析“ViewManager”代表上下文边界。基本上ViewManagers最终在不同的UI容器中。如果有帮助,我可以给你邮寄一些代码。 – Marius 2010-07-09 05:49:10