У меня есть пользовательская библиотека .NET Framework, которая используется для различных целей, таких как ведение журнала, безопасность и т. Д. В моем приложении 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
и использовать его ( не уверен, хорошо ли он работает в любом случае )
Чтобы обернуть это:
Есть ли хороший / простой способ разрешения служб в атрибутах WCF
(, как указано выше ), используя только Microsoft.Extensions.DependencyInjection.Abstractions ?
Если 1) невозможно. Есть ли способ, как получить IInstanceProvider
, созданный приложением верхнего уровня ( от потребителя пакета в данном случае ), и использовать его здесь в атрибуте?
Является ли создание статического объекта IserviceProvider
единственным решением или есть другие хорошие способы без больших изменений?