#inversion-of-control #autofac
#инверсия управления #autofac
Вопрос:
Это то, что у меня есть:
public interface INamed
{
string Name { get; }
}
public interface IService
{
}
public class Service : IService
{
}
public class ServiceUser
{
public ServiceUser(IEnumerable<Lazy<IService, INamed>> services)
{
var cnt = services.Count(); // Always 0.
}
}
var builder = new ContainerBuilder();
builder.Register(c => new Service())
.As<IService>()
.WithMetadata<INamed>(m => m.For(n => n.Name, "Test"));
builder.RegisterType<ServiceUser>();
var container = builder.Build();
var su = container.Resolve<ServiceUser>();
Коллекция отложенных сервисов<IService, INamed> в ctor ServiceUser всегда пуста. Можете ли вы объяснить, что я делаю не так? Одна вещь, которую я сразу не понимаю, — это то, откуда берется конкретная реализация INamed. Я думаю, Autofac генерирует это внутренне? Пожалуйста, помогите прояснить ситуацию для меня.
Комментарии:
1. Привет — ваш код выглядит идеально, я попробую это в отладчике; предполагая, что у вас есть последняя версия Autofac на .NET 4? Кстати, реализация метаданных происходит из msdn.microsoft.com/en-us/library/dd779644.aspx
2. Определенно на .Net 4. Мне придется дважды проверить версию Autofac. Я сделаю это сегодня вечером или завтра.
3. Я запускал 2.3.x. Обновление устранило проблему. НО, это была настоящая заноза в заднице, чтобы обновить мой сайт MVC2 до MVC3 только для использования последней версии Autofac. Я действительно думаю, что он должен поддерживать обратную совместимость с MVC2.
4. Рад, что вы нашли решение. Вместо того, чтобы обновлять весь ваш сайт, я должен указать, что существуют другие перегрузки
WithMetadata
, которые вы могли бы использовать с гораздо меньшим воздействием 😉 Тем не менее — новый Autofac, новый MVC, звучит как победа!5. Только я запускаю это в Linux, и поддержка Mono для MVC3 не была полностью проверена. Так что, возможно, для меня это не лучшая ситуация для обновления. И я протестировал проблему, и она присутствовала на обоих. Сеть и моно, кстати.
Ответ №1:
Обновите до последней версии Autofac.