Asp.net mvc 有条件的统一决议?

Asp.net mvc 有条件的统一决议?,asp.net-mvc,unity-container,Asp.net Mvc,Unity Container,简短的版本是,我想向Unity注册接口的可能实现,但根据应用程序配置,这些实现可能不可用 具体来说,这些是ASP.NET身份电子邮件、SMS等的双因素实现。它们的参数在web.config中设置,在某些环境中它们可能不可用。例如,我们无法从开发人员的笔记本电脑发送电子邮件 我想使用ResolveAll获取可用的注入工厂,只需注册适当的注入工厂,如果它们不可用,则返回null。但是,这实际上会导致调用ResolveAll时出现空项 基本上,我想要的是,在InjectionFactory Func中

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

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

我想使用ResolveAll获取可用的注入工厂,只需注册适当的注入工厂,如果它们不可用,则返回null。但是,这实际上会导致调用ResolveAll时出现空项

基本上,我想要的是,在InjectionFactory Func中,向统一发出信号的能力,不要紧;我无法解决这个问题,抱歉;不要将我用作注册来源

如果没有以下条件,这是否可行:

将注册与注册本身分开,因此基本上如果CanRegisterEmailTwoFactor container.RegisterEmail,new InjectionFactoryCreateEmailTwoFactor 要求所有ResolveAll调用排除null
另外请注意,可能还有两个相互竞争的注册,例如,内部SMTP与SendGrid,默认行为是只返回最后一个注册的注册,因此我还希望避免第二个不可用的注册将第一个注册覆盖为null。

直到出现更好的答案,我所做的是用RegisterInstance替换RegisterType,如下所示:

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

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

您可以使用吗?不太可以;这些项目将以下拉列表的形式显示给用户。