У меня была похожая проблема, как у пользователя6130.Я хотел избежать использования IIndex
в моей реализации класса и вместо этого передать преобразователь службы в мой конструктор.
Итак, теперь у меня есть реализация службы со следующим конструктором:
<pre></p>
<pre><code>public MvcMailer(Converter<string, MailerBase> mailerResolver)
{
_resolver = mailerResolver;
}
Я хотел использовать службы с ключами, не полагаясь непосредственно на пространство имен Autofac.Я получал ту же ошибку, пока не реструктурировал конфигурацию как таковую.
1) Сканирование всех моих реализаций почтовой программы и индекса по имени класса (может быть улучшено)
</p>
<pre><code>builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetExecutingAssembly())
.Where(t => t.Name.EndsWith("Mailer")).Keyed<Mvc.Mailer.MailerBase>(t => t.Name.Replace("Mailer", "").ToLower());
2) Зарегистрировать конвертер в конфигурации Autofac
</p>
<pre><code>builder.Register<System.Converter<string,Mvc.Mailer.MailerBase>>(c => {
var all = c.Resolve<Autofac.Features.Indexed.IIndex<string,Mvc.Mailer.MailerBase>>();
return delegate(string key)
{
return all[key];
};
});
3) Зарегистрироваться как другие типыкомпонентов и пусть Autofac обрабатывает преобразователь впрыска
</p>
<pre><code>builder.RegisterType<Mailers.MvcMailer>().As<Mailers.IMailer>();