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

How to inject properly a service in WCF service and other services by using SimpleInjector

如果有两个这样定义的 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;
     }
}

如果在Service1中注入了Service2,用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();

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

设置了它

此外,由于对服务的每个 WCF 调用都在其自己的请求中运行,因此存在一个新的范围,并且每个服务都将获得自己的 Service2 实例,无论您是否将其注册为 Transient ] 或 Scoped。仅当您将其注册为 Singleton 时,您才会看到 Service2 的相同实例在请求中被重用;事实上,Singleton 在 WCF 服务的生命周期内只有一个 Service2 实例。

这里真正的问题是,如果 WcfService1WcfService2 依赖于直接或间接依赖于 Service2 的其他 类,则必须是相同的实例Service2 在该请求期间使用,或者在该单个请求期间可以有多个 Service2 实例吗?如果多实例没问题,可以注册为Transient,否则注册为Scoped.

如果您希望您的组件具有短暂的生活方式,则以下注册将起到作用。

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