我在WCF中使用UserNamePasswordValidator以及Unity来进行依赖注入,但由于WCF创建了UserNamePasswordValidator的实例,因此无法将我的容器注入到类中。那怎么会这样呢?
我能想到的最简单的解决方案是围绕UnityContainer的静态实例创建一个静态代理/包装类,它暴露所有相同的方法......这样,任何类都可以访问容器,我不会需要在任何地方注入它。
所以我可以在代码中的任何地方进行UnityContainerWrapper.Resolve()。所以基本上这个解决方案为我解决了两个问题,我可以在我没有创建实例的类中使用它,并且我可以在任何地方使用它而无需将容器注入到一堆类中。
我唯一能想到的缺点是,我现在可能会将我的容器暴露给一堆以前无法访问容器的类。不确定这是否是一个问题?
答案 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
}
这只是使用统一容器的静态包装器的倒置想法:)