Передайте массив типов в конструктор, используя Unity Dependency Injection - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть несколько классов, которые являются производными от интерфейса

public interface IMetadataItem
{
  Do();
}

public class MyClass1 : IMetadataItem
{
  public void Do()
  {
  }
}

public class MyClass2 : IMetadataItem
{
 public void Do()
 {
 }
}

Я хотел бы связать эти классы интерфейса IMetadataItem с конструктором другого класса

public class MetadataService: IMetadataService
{
  public MetadataService(IEnumerable<IMetadataItem> metadataItems)
  {
    //metadataItems always has zero(0) items
  }
}

К сожалению, я всегда получаю пустой IEnumerablelist.

Конфигурация Unity выглядит как

     container.RegisterTypes(
            AllClasses.FromLoadedAssemblies().Where(type => typeof(IMetadataItem).IsAssignableFrom(type)),
            WithMappings.FromAllInterfaces,
            WithName.TypeName,
            WithLifetime.ContainerControlled);

        container.RegisterType<IMetadataService, Services.MetadataService>(new ContainerControlledLifetimeManager(),
            new InjectionConstructor(new ResolvedArrayParameter<IMetadataItem>()) ); 

Есть идеи, что я делаю неправильно?

1 Ответ

0 голосов
/ 27 сентября 2018

Для Unity v5:

Вы можете удалить 2-й параметр InjectionConstructor из RegisterType

container.RegisterType<IMetadataService, MetadataService>(
    new ContainerControlledLifetimeManager());

Для v4:

Unity не понимает внутренне IEnumerable<> ( см. Здесь ), поэтому вам нужно будет изменить конструктор, чтобы он брал массив вместо перечисляемого

public class MetadataService: IMetadataService
{
    public MetadataService(IMetadataItem[] metadataItems)
    {
    }
}
...