如何在 WCF 中的 IServiceBehavior、IOperationBehavior 自定义接口中使用 ISer



我有一个自定义的.NET框架库,用于WCF应用程序中的不同目的,如日志记录,安全性等。目前,我们在这两种情况下都使用 Autofac,用于库和WCF应用程序。但最近我们决定移出Autofac并使用Microsoft.Extensions.DependencyInjection.Abstractions,因为消费者可能希望使用不同的DI包。在我开始更改我们在整个应用程序中使用的某些属性之前,更改内容很容易。

例如,我们有一个属性,如下所示:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false)]
public sealed class SecurityBehaviorAttribute : Attribute, IServiceBehavior, IOperationBehavior
{
private readonly ISecurityManager _securityManager;
public SecurityBehaviorAttribute()
{
_securityManager = AutofacHostFactory.Container.Resolve<ISecurityManager>();
}
//Implemented methods
}

由于我们不再有AutofacHostFactory.Container,我们需要另一种方法来获得这些服务,但我不确定是否有办法在WCF做到这一点?

在搜索时,我找到了一些信息来创建自定义IInstanceProvider这可能会有所帮助,但我仍然不确定它是如何工作的,因为我没有找到任何将其与抽象包集成的示例。由于在我的顶级应用程序中我们使用 Autofac.Integration.Wcf,我认为在幕后这个包会为内部需求创建自定义IInstanceProvider,如果是这样,我如何将此接口注入到我的属性以及如何使用它(这样消费者将负责创建自定义IInstanceProvider,我将在我的包中使用它)?

另一个丑陋的解决方案是创建一个IServiceProvider的单例实例并使用它(不确定它是否运行良好)

总结一下:

  1. 有没有一种好的/直接的方法,如何仅使用Microsoft.Extensions.DependencyInjection.Abstractions来解决WCF属性(如上面的一个)中的服务?

  2. 如果1)是不可能的。有没有办法获取由顶级应用程序(在这种情况下来自包的消费者)创建的IInstanceProvider并在属性中使用它?

  3. 创建IserviceProvider的静态对象是唯一的解决方案,还是有其他没有大变化的好方法?

在尝试了这么多方法之后,除了将IServiceProvider存储到静态属性中并重用它之外,我无法使其他任何东西工作。

最新更新