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

标签 c# wpf dependency-injection castle-windsor caliburn

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

相关文章:

architecture - 序列化与 ctor 注入(inject)和保护不变量

.net - Unity Resolve Array 参数不注入(inject)依赖项数组

c# - 我如何使用自定义 IChannel 或 IChannelFactory 访问 ClientCredentials?

c# - double 组的 Akima 插值

WPF:检测窗口何时失去焦点

wpf - 如何获取网格行的数据上下文

c# - 具有依赖注入(inject)的 AutoMapper 不映射配置文件?

c# - ASP.net MVC - 我应该使用 AutoMapper 从 ViewModel 到 Entity Framework 实体吗?

c# - 你如何处理大型项目?

c# - 如何查看计算机上安装的 Windows Media Player 版本?