我有两种类型的 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 容器中注册了一个服务:
public class Service : IService {}
container.Register(Component.For<IService>()
.ImplementedBy<Service >().LifeStyle.Transient);
我希望 ViewModelA 和 ViewModelB 共享同一个 IService 实例。
我不不希望 ViewModelA 和 ViewModelB 的所有实例共享同一个实例。
每个父/子对都有自己的实例,我不想使用 DependencyInjection 来实现,这可以做到吗?
我不希望通过依赖注入(inject)来完成此操作,因为我在 A 下拥有完整的 ViewModel 层次结构,而不仅仅是一个 (B) View 模型。
VM A -> VM B -> VM C -> VM D ...(假设我遍历所有字母表)所有这些都需要共享相同的 IService 实例。
A 的另一个实例及其后代将共享一个不同的 IService 实例。
最佳答案
您可以使用Scoped Lifestyles。这是一些单元测试的示例,它们似乎可以满足您的要求:
[Fact]
public void VMsInSameScopeSharesService()
{
var container = new WindsorContainer();
container.Register(Component.For<ViewModelA>().LifestyleTransient());
container.Register(Component.For<ViewModelB>().LifestyleTransient());
container.Register(Component
.For<IService>().ImplementedBy<NullService>().LifestyleScoped());
using (container.BeginScope())
{
var a = container.Resolve<ViewModelA>();
Assert.Equal(a.service, a.childViewModel.service);
}
}
[Fact]
public void VMsInDifferentScopesDoNotShareServices()
{
var container = new WindsorContainer();
container.Register(Component.For<ViewModelA>().LifestyleTransient());
container.Register(Component.For<ViewModelB>().LifestyleTransient());
container.Register(Component
.For<IService>().ImplementedBy<NullService>().LifestyleScoped());
IService service1;
using (container.BeginScope())
{
var a = container.Resolve<ViewModelA>();
service1 = a.service;
}
IService service2;
using (container.BeginScope())
{
var a = container.Resolve<ViewModelA>();
service2 = a.service;
}
Assert.NotEqual(service1, service2);
}
但是,这是一个非常奇特的要求,这让我想知道为什么您希望它的行为完全像这样,或者您是否不能以一种可以使它更简单的方式构建您的代码。
关于c# - Windsor LifeStyle - 每个图形的共享实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25064516/