如何将对象注入WCF验证器类

时间:2009-07-24 07:50:51

标签: .net wcf dependency-injection ninject wcf-security

继续使用WCF services的依赖注入,是否有任何方法可以将DI用于WCF 验证器,以便人们可以这样做:

public class DIValidator : UserNamePasswordValidator
{
    private readonly IService service;

    [Inject]
    public DIValidator(IService service)
    {
        this.service = service;
    }

    public override void Validate(string userName, string password)
    {
        service.Login(userName, password);
    }
}

编辑 - 我尝试将Dzmitry的建议应用于我的自定义行为扩展,因为我的验证器是在app.config中定义的。可悲的是,我得到一个MethodMissingException,因为wcf希望我的验证器有一个默认的构造函数:

System.MissingMethodException: No default constructor has been defined for this object.

at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)

这是我的行为类:

    public class DependencyInjectionServiceBehavior : BehaviorExtensionElement, IServiceBehavior
    {
        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            serviceHostBase.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = DISupport.Kernel.Get<IService>();
        }
    }

2 个答案:

答案 0 :(得分:3)

一般情况下,自定义验证器是以编程方式分配的(也可能是从配置文件中这样做的)这样的事情,它是在服务主机打开之前完成的,基本上这也是你创建DI容器实例的时间。进一步用于通过实例提供程序服务实例:

serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new LocalUserNamePasswordValidator();

您也可以使用DI容器来创建自定义验证器。

serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = unityContainer.Resolve<UserNamePasswordValidator>();

答案 1 :(得分:2)

我知道这不是您正在寻找的解决方案,但我会创建一个默认构造函数,从您的IoC容器(服务定位器而不是DI)获取IService。这不是最好的方法,但我能想到的最简单。

编辑:当然你可以留下允许你注入依赖关系的构造函数,如果你需要模拟IService进行测试或任何其他的purpouse。