Как использовать IServiceProvider в пользовательских интерфейсах IServiceBehavior, IOperationBehaviour в WCF? - PullRequest
0 голосов
/ 08 июля 2019

У меня есть пользовательская библиотека .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 и использовать его ( не уверен, хорошо ли он работает в любом случае )

Чтобы обернуть это:

  1. Есть ли хороший / простой способ разрешения служб в атрибутах WCF (, как указано выше ), используя только Microsoft.Extensions.DependencyInjection.Abstractions ?

  2. Если 1) невозможно. Есть ли способ, как получить IInstanceProvider, созданный приложением верхнего уровня ( от потребителя пакета в данном случае ), и использовать его здесь в атрибуте?

  3. Является ли создание статического объекта IserviceProvider единственным решением или есть другие хорошие способы без больших изменений?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...