2016-09-19 15 views
0

У меня есть три объявления класса, как и вышеЕсть ли способ вставить процесс создания экземпляра autofac?

[Plug("hello")] 
public class Plug1 : IPlug{} 
[Plug("hello")] 
public class Plug2 : IPlug{} 
[Plug("world")] 
public class Plug3 : IPlug{} 

Когда я использую container.Resolve<IEnumerable<IPlug>>(), чтобы решить, я получаю все экземпляр, который реализует интерфейс IPlug, однако, я хочу, чтобы получить первый и второй (или в мире, который экземпляр был помечен атрибутом Plug("hello")).

Есть ли способ достичь этого?

Я хотел бы избежать использования

container.Resolve<IEnumerable<IPlug>>() 
     .Where(t => t.FirstAttribute<Plug>() != null 
        && t.FirstAttribute<Plug>().Id == "Hello") 

Я всегда чувствую, что это не лучшая практика, как результат работы.

ответ

1

Существует много способов сделать то, что вы хотите.

Самый простой способ будет зарегистрировать свой тип, названный регистрации

builder.RegisterType<Plug1>().As<IPlug>().WithMetadata("plug", "hello"); 
builder.RegisterType<Plug2>().As<IPlug>().WithMetadata("plug", "hello"); 
builder.RegisterType<Plug3>().As<IPlug>().WithMetadata("plug", "world"); 

вы также можете использовать атрибут для регистрации этих типов:

builder.RegisterType<Plug1>() 
     .As<IPlug>() 
     .WithMetadata("plug", typeof(Plug1).FirstAttribute<Plug>().?Id ?? "Default"); 

Тогда вы будете иметь возможность получить все названные IPlug регистрация с помощью IEnumerable<Meta<IPlug>>:

container.Resolve<IEnumerable<Meta<IPlug>>>() 
     .Where(m => m.Metadata["plug"] as String == "hello") 
     .Select(m => m.Value); 

Если вы не хотите, чтобы фильтровать во время выполнения, но при корневой композиции IoC и IEnumerable<IPlug> всегда будет решать фильтрованное IEnumerable<IPlug>, то вы можете переопределить IEnumerable<IPlug> регистрации:

builder.Register(c => c.Resolve<IEnumerable<Meta<IPlug>>>() 
         .Where(m => m.Metadata["plug"] as String == "hello") 
         .Select(m => m.Value)) 
     .As<IEnumerable<IPlug>>(); 
+0

спасибо. это хороший выбор. – linus