2016-02-19 5 views
0

Для следующего кода, как я могу решить на основе имени?IoC StructureMap разрешить именованный экземпляр

public interface IService 
{} 

public class ServiceA : IService 
{} 

public class ServiceB : IService 
{} 

public class ClassA 
{ 
    public IService service { get; set; } 

    public ClassA(IService service) 
    { 
     this.service = service; 
    } 
} 

public class ClassB 
{ 
    public IService service { get; set; } 

    public ClassB(IService service) 
    { 
     this.service = service; 
    } 
} 

реестра:

public class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     For<IService>().Add<ServiceA>().Ctor<IService>().Is(i => i.GetInstance<IService>("ServiceA")); // error 
    } 
} 

Использование:

container = new Container(new MyRegistry()); 
var test = container.GetInstance<ClassA>(); 

Проблема:

  • Для ClassA IService => должен Выход ServiceA
  • Для ClassB IService => должен дать ServiceB

  • Кроме того, Есть ли способ, чтобы использовать атрибуты в конструкторе указать конкретную реализацию для конкретного типа? (Поэтому он не должен быть указан в конфигурации?)

ответ

0

У меня это работает> ответ @ ozczcho помог. спасибо

For<ClassA>().Use<ClassA>().Ctor<IService>("service").Is<ServiceA>(); 
    For<ClassB>().Use<ClassB>().Ctor<IService>("service").Is<ServiceB>(); 
0

Мы создали нашу собственную RegistrationConvention (обратите внимание на эту реализацию регистрирует каждый плагин семьи как Singleton):

public class SingletonConvention<TPluginFamily> : IRegistrationConvention 
{ 
    public void Process(Type type, Registry registry) 
    { 
     if (!type.IsConcrete() || !type.CanBeCreated() || !type.AllInterfaces().Contains(typeof(TPluginFamily))) 
      return; 

     registry.For(typeof(TPluginFamily)).Singleton().Use(type).Named(type.Name); 
    } 
} 

, а затем в наш регистрационный номер (непроверенный ниже):

 Scan(y => 
     { 
      y.With(new SingletonConvention<IService>()); 
      y.Assembly(Assembly.GetExecutingAssembly().FullName); 
     }); 

     For<ClassA>() 
      .Use<ClassA>() 
      .Ctor<IService >("service").Is("service",x => 
      { 
       var service = x.GetInstance<IService>().Named("ServiceA"); 

       return service; 
      }) 
Смежные вопросы