如何将依赖项注入WCF中的自定义UserNamePasswordValidator?

时间:2010-05-22 01:04:27

标签: wcf security dependency-injection unity-container ioc-container

我在WCF中使用UserNamePasswordValidator以及Unity来进行依赖注入,但由于WCF创建了UserNamePasswordValidator的实例,因此无法将我的容器注入到类中。那怎么会这样呢?

我能想到的最简单的解决方案是围绕UnityContainer的静态实例创建一个静态代理/包装类,它暴露所有相同的方法......这样,任何类都可以访问容器,我不会需要在任何地方注入它。

所以我可以在代码中的任何地方进行UnityContainerWrapper.Resolve()。所以基本上这个解决方案为我解决了两个问题,我可以在我没有创建实例的类中使用它,并且我可以在任何地方使用它而无需将容器注入到一堆类中。

我唯一能想到的缺点是,我现在可能会将我的容器暴露给一堆以前无法访问容器的类。不确定这是否是一个问题?

1 个答案:

答案 0 :(得分:2)

是的,这种下滑真的很糟糕,你应该避免它。在你的情况下,你可以做这样的事情

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
             }

这只是使用统一容器的静态包装器的倒置想法:)