我有一个自定义的.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
的单例实例并使用它(不确定它是否运行良好)
总结一下:
有没有一种好的/直接的方法,如何仅使用Microsoft.Extensions.DependencyInjection.Abstractions来解决
WCF
属性(如上面的一个)中的服务?如果1)是不可能的。有没有办法获取由顶级应用程序(在这种情况下来自包的消费者)创建的
IInstanceProvider
并在属性中使用它?创建
IserviceProvider
的静态对象是唯一的解决方案,还是有其他没有大变化的好方法?
在尝试了这么多方法之后,除了将IServiceProvider
存储到静态属性中并重用它之外,我无法使其他任何东西工作。