代码之家  ›  专栏  ›  技术社区  ›  kord

如何使用SimpleInjector在WCF服务和其他服务中正确注入服务

  •  0
  • kord  · 技术社区  · 8 年前

    如果有两个WCF服务定义如下:

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class WcfService1: IWcfService1
    {
         private IService1 _service1;
         public WcfService(IService1 service1){
             _service1 = service1;
         }
    }
    
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class WcfService2: IWcfService2
    {
         private IService2 _service2;
         public WcfService(IService2 service2){
             _service2 = service2;
         }
    }
    

    如果Service2被注入Service1,那么用SimpleInjector注册Service2的最佳方式是什么?

    这样地

    container.RegisterPerWcfOperation<IService1, Service1>();    
    container.RegisterPerWcfOperation<IService2, Service2>();
    

    或者像这样

    container.RegisterPerWcfOperation<IService1, Service1>();    
    container.Register<IService2, Service2>(Lifestyle.Scoped);
    

    容器配置如下:

    container.Options.DefaultScopedLifestyle = new WcfOperationLifestyle();
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Steven    8 年前

    首先,使用(旧的)扩展方法,例如 RegisterPerWcfRequest 不鼓励,因为新的 Lifestyle.Scoped 所有物 生活方式。范围 提供了一个更简单、更可读、更灵活的注册作用域实例的模型,同时使用了相同的底层生活方式,因为您通过 Options.DefaultScopedLifestyle .

    此外,由于对服务的每个WCF调用都在自己的请求中运行,因此存在一个新的作用域,每个服务都将获得自己的实例 Service2 ,无论您是否将其注册为 Transient Scoped 。仅当您将其注册为 Singleton 您将看到相同的实例 服务2 在请求上重用;事实上 辛格尔顿 只有一个实例 服务2 在WCF服务的生命周期内。

    这里真正的问题是,如果 WcfService1 WcfService2 依赖于直接或间接依赖于的其他类 服务2 同样,必须使用相同的 服务2 在该请求期间使用,或者可以有多个 服务2 在那一次请求中?如果可以使用多个实例,则可以将其注册为 转瞬即逝的 ,否则为 范围界定 .

    如果你想让你的组件拥有短暂的生活方式,下面的注册就可以做到。

    container.Register<IService1, Service1>();    
    container.Register<IService2, Service2>();