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实例。