Автофактор с данными не работает

#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.