继续使用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>();
}
}
答案 0 :(得分:3)
一般情况下,自定义验证器是以编程方式分配的(也可能是从配置文件中这样做的)这样的事情,它是在服务主机打开之前完成的,基本上这也是你创建DI容器实例的时间。进一步用于通过实例提供程序服务实例:
serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new LocalUserNamePasswordValidator();
您也可以使用DI容器来创建自定义验证器。
serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = unityContainer.Resolve<UserNamePasswordValidator>();
答案 1 :(得分:2)
我知道这不是您正在寻找的解决方案,但我会创建一个默认构造函数,从您的IoC容器(服务定位器而不是DI)获取IService。这不是最好的方法,但我能想到的最简单。
编辑:当然你可以留下允许你注入依赖关系的构造函数,如果你需要模拟IService进行测试或任何其他的purpouse。