代码之家  ›  专栏  ›  技术社区  ›  Blake Pettersson

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

  •  11
  • Blake Pettersson  · 技术社区  · 17 年前

    后续使用依赖注入 WCF services ,有没有办法在wcf中使用di 验证器 ,这样就可以做到:

    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 回复  |  直到 17 年前
        1
  •  3
  •   Dzmitry Huba    17 年前

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

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

    您还可以使用di容器创建自定义验证器。

    serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = unityContainer.Resolve<UserNamePasswordValidator>();
    
        2
  •  2
  •   maciejkow    17 年前

    我知道这不是您要寻找的解决方案,但我将创建一个默认构造函数,从您的ioc容器(服务定位器而不是di)获取i service。这不是最好的办法,但却是我能想到的最简单的办法。

    编辑:当然,如果您需要为测试或任何其他目的模拟iSeries设备,您可以离开允许您注入依赖项的构造函数。

    推荐文章