gpt4 book ai didi

c# - Windsor LifeStyle - 每个图形的共享实例

转载 作者:行者123 更新时间:2023-11-30 19:40:05 26 4
gpt4 key购买 nike

我有两种类型的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com