如何使用 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
实例。
这里真正的问题是,如果 WcfService1
或 WcfService2
依赖于直接或间接依赖于 Service2
的其他 类,则必须是相同的实例Service2
在该请求期间使用,或者在该单个请求期间可以有多个 Service2
实例吗?如果多实例没问题,可以注册为Transient
,否则注册为Scoped
.
如果您希望您的组件具有短暂的生活方式,则以下注册将起到作用。
container.Register<IService1, Service1>();
container.Register<IService2, Service2>();
如果有两个这样定义的 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
实例。
这里真正的问题是,如果 WcfService1
或 WcfService2
依赖于直接或间接依赖于 Service2
的其他 类,则必须是相同的实例Service2
在该请求期间使用,或者在该单个请求期间可以有多个 Service2
实例吗?如果多实例没问题,可以注册为Transient
,否则注册为Scoped
.
如果您希望您的组件具有短暂的生活方式,则以下注册将起到作用。
container.Register<IService1, Service1>();
container.Register<IService2, Service2>();