Windsor LifeStyle – 每个图形的共享实例

我有两种类型的ViewModel

public class ViewModelA { IService service; private ViewModelB childViewModel; public ViewModelA(IService service,ViewModelB childViewModel) { this.service = service; this.childViewModel = childViewModel; } public ViewModelB ChildViewModel { get { return childViewModel; } } } public class ViewModelB { IService serivce; public ViewModelB(IService service) { this.service = service; } } 

我在Windsor Container注册了一项服务:

  public class Service : IService {} container.Register(Component.For() .ImplementedBy().LifeStyle.Transient); 

我希望ViewModelA和ViewModelB共享同一个IService实例。

不希望 ViewModelA和ViewModelB的所有实例共享同一个实例。

每个父/子对都有自己的实例,我不想用DependencyInjection来实现这个,这可以做到吗?

我不希望通过dependency injection来完成,因为我在A下有一个完整的ViewModel层次结构,而不仅仅是一个(B)视图模型。

虚拟机A – >虚拟机B – >虚拟机C – >虚拟机D …(让我们说错过所有字母)所有这些都需要共享同一个IService实例。

和A的另一个实例,它的死者将共享一个不同的IService实例。

您可以使用Scoped Lifestyles 。 以下是一些unit testing的示例,它们似乎可以满足您的需求:

 [Fact] public void VMsInSameScopeSharesService() { var container = new WindsorContainer(); container.Register(Component.For().LifestyleTransient()); container.Register(Component.For().LifestyleTransient()); container.Register(Component .For().ImplementedBy().LifestyleScoped()); using (container.BeginScope()) { var a = container.Resolve(); Assert.Equal(a.service, a.childViewModel.service); } } [Fact] public void VMsInDifferentScopesDoNotShareServices() { var container = new WindsorContainer(); container.Register(Component.For().LifestyleTransient()); container.Register(Component.For().LifestyleTransient()); container.Register(Component .For().ImplementedBy().LifestyleScoped()); IService service1; using (container.BeginScope()) { var a = container.Resolve(); service1 = a.service; } IService service2; using (container.BeginScope()) { var a = container.Resolve(); service2 = a.service; } Assert.NotEqual(service1, service2); } 

但是,这是一个非常奇特的要求,这让我想知道为什么你希望它的行为完全像这样,或者如果你不能以一种使这个更简单的方式构造你的代码。

对我有用的是:LifeStyle BoundTo

  container.Register(Component.For() .ImplementedBy() .LifeStyle.BoundTo()); 

图表:

  public class ViewModelAConductor { private List rootViewModels = new List(); public ViewModelAConductor() { ViewModelA a1 = container.Resolvce(); rootViewModels.Add(a1); ViewModelA a2 = container.Resolvce(); rootViewModels.Add(a2); } } public class ViewModelA { ViewModelB viewModelB; IService service; public ViewModelA(IService service,ViewModelB viewModelB) { this.service = service; this.viewModelB = viewModelB; } } public class ViewModelB { ViewModelC viewModelC; IService service; public ViewModelA(IService service,ViewModelC viewModelC) { this.service = service; this.viewModelC = viewModelC; } } public class ViewModelC { IService service; public ViewModelA(IService service) { this.service = service; } } 

a1的图形下注入的所有ViewModel都具有相同的IService实例。

a2的图形下注入的所有ViewModel都具有相同的IService实例。