11

跟进对WCF 服务使用依赖注入,是否有任何方法可以将 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>();
        }
    }
4

2 回答 2

3

一般来说,自定义验证器是通过编程方式分配的(也可以从配置文件中分配)类似这样的东西,它是在服务主机打开之前完成的,基本上这也是您创建将进一步使用的 DI 容器实例的时间通过实例提供者服务实例:

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

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

serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = unityContainer.Resolve<UserNamePasswordValidator>();
于 2009-07-24T08:05:24.890 回答
2

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

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

于 2009-07-24T08:01:03.260 回答