我有一个自定义的.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
的单例实例并使用它(不确定它是否仍然可以正常工作)
总结一下:
是否有一种好/简单的方法如何仅使用Microsoft.Extensions.DependencyInjection.Abstractions来解析WCF
属性(类似上述)中的服务?
如果 1)是不可能的。有没有一种方法来获取由顶级应用程序创建的IInstanceProvider
(在这种情况下是从包装的使用者中获取 )并在此处在属性中使用它?
创建IserviceProvider
的静态对象是唯一的解决方案,还是有其他没有较大变化的好方法?
答案 0 :(得分:0)
尝试了许多方法之后,除了将IServiceProvider
存储到静态属性中并重新使用它之外,我无法做其他任何事情。