如何在WCF中的IServiceBehavior,IOperationBehaviour自定义接口中使用IServiceProvider?

时间:2019-07-08 07:38:05

标签: c# wcf dependency-injection autofac

我有一个自定义的.NET Framework库,该库用于WCF应用程序中的各种目的,例如日志记录,安全性等。当前,对于库和WCF应用程序,在这两种情况下我们都使用Autofac。但是最近,我们决定退出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属性(类似上述)中的服务?

    < / li>
  2. 如果 1)是不可能的。有没有一种方法来获取由顶级应用程序创建的IInstanceProvider(在这种情况下是从包装的使用者中获取 )并在此处在属性中使用它?

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

1 个答案:

答案 0 :(得分:0)

尝试了许多方法之后,除了将IServiceProvider存储到静态属性中并重新使用它之外,我无法做其他任何事情。