Как внедрить зависимости в пользовательский UserNamePasswordValidator в WCF? - PullRequest
2 голосов
/ 22 мая 2010

Я использую UserNamePasswordValidator в WCF вместе с Unity для внедрения зависимостей, но поскольку WCF создает экземпляр UserNamePasswordValidator, я не могу внедрить свой контейнер в класс. Итак, как можно поступить об этом?

Самое простое решение, которое я могу придумать, - это создать статический прокси / класс-оболочку вокруг статического экземпляра UnityContainer, который предоставляет все те же методы ... Таким образом, любой класс может получить доступ к контейнеру, и я не Не нужно вводить это везде.

Так что я мог бы просто сделать UnityContainerWrapper.Resolve () в любом месте кода. Таким образом, в основном это решение решает 2 проблемы для меня, я могу использовать его в классах, для которых я не создаю экземпляр, и я могу использовать его где угодно, не вставляя контейнер в группу классов.

Единственный недостаток, о котором я могу подумать, - это то, что теперь я потенциально могу выставить свой контейнер группе классов, которые раньше не имели бы доступа к контейнеру. Не совсем уверен, если это даже проблема, хотя?

1 Ответ

2 голосов
/ 22 мая 2010

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

public class CustomUserNameValidator : UserNamePasswordValidator
    {
        public static CustomUserNameValidator Current {
            get; private set;
        }

        public CustomUserNameValidator() {
            Current = this;
        }

        public override void Validate(string userName, string password)
        {
            throw new FaultException("No pasaran");

        }

        [Dependency]
        public ISomeService Service {
            get; set;
        }
    }

Он будет создан только один раз для службы при создании хоста службы, поэтому вы должны написать следующий код

 using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService))) //here it will be created
            {
                container.BuildUp(CustomUserNameValidator.Current); //here you can inject all you need
             }

Это просто перевернутая идея со статической оболочкой контейнера Unity:)

...