Для приложения у меня есть несколько IAuthentificationProvider:
public interface IAuthentificationProvider
{
bool IsUserValid(string login, string password)
}
Для каждого IAuthentificationProvider У меня есть IAuthentificationProviderConfig, связанный с:
public interface IAuthentificationProvider
{
bool IsEnabled { get; set; }
}
Для использования всех этих включенных поставщиков у меня есть другой класс :
public class AuthentificationManager
{
public AuthentificationManager(IEnumerable<IAuthentificationProvider> providers)
{
//do something with providers
}
//other class logic
}
Теперь я хочу регистрировать только включенных провайдеров. Я пробовал что-то подобное:
//finding all possible providers in assembly
var providerInterface = typeof(IAuthentificationProvider);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => providerInterface.IsAssignableFrom(p) && !p.IsAbstract).ToList();
foreach (var type in types)
{
//Register type as self for simple resolve in lambda expression
containerBuilder.RegisterType(type).AsSelf().SingleInstance();
containerBuilder.Register(c =>
{
var configs = c.Resolve<IAuthentificationProvidersConfig>();
//get specific configuration for provider
var config = configs.GetConfig(type.Name);
if (config.IsEnabled)
{
//return provider
return c.Resolve(type);
}
else
{
//"cancel the register"
return new object();
}
}).As<IAuthentificationProvider>().SingleInstance();
}
В Autofa c 4.9 вышеуказанный код работает, но теперь в Autofa c 5.1.2 строка return new object();
больше не работает:
InvalidCastException: Object cannot be stored in an array of this type.
Есть ли другой способ отменить регистр внутри лямбды?