Unity中的条件解析?

时间:2015-11-10 23:07:05

标签: asp.net-mvc unity-container

简短版本是,我想注册与Unity的接口的可能实现,但根据应用程序配置,这些实现可能不可用。

具体来说,这些是ASP.NET身份(电子邮件,短信等)的双因素实现。它们的参数在web.config中设置,在某些环境中它们可能不可用(例如,我们无法从我们的开发笔记本电脑发送电子邮件)。

我想使用ResolveAll来获取可用的那些,并简单地注册相应的InjectionFactories,如果它们不可用,则返回null。但是,实际上这会导致调用ResolveAll的空项。

基本上,我想要的是相当于在InjectionFactory Func内向Unity发出信号的能力,“没关系;我实际上无法解决这个问题,抱歉;不要用我作为注册来源“。

这可能没有

  1. 从注册本身拆分“可以注册”,所以基本上是if (CanRegisterEmailTwoFactor) container.Register<ITwoFactor>("Email", new InjectionFactory(CreateEmailTwoFactor))
  2. 要求所有ResolveAll调用排除空值
  3. 另请注意,可能还有两个竞争注册(例如,内部SMTP与SendGrid),默认行为是仅返回最后一个注册,所以我也想避免第二个,不可用的注册用null覆盖第一个。

1 个答案:

答案 0 :(得分:0)

在得到更好的答案之前,我所做的是将RegisterType替换为RegisterInstance,如下所示:

private static void ConditionalRegisterInstance<T>(IUnityContainer container, Func<IUnityContainer, T> factory)
{
            T toRegister = factory(container);
            if (toRegister != null)
                container.RegisterInstance<T>(toRegister);
}

这对双因素提供者来说是可以接受的,因为它们可以重复使用。只要您不介意创建并丢弃“测试实例”,在测试工厂实际上可以创建项目之后,您也可以使用RegisterType对工厂执行相同操作。