1

Возможно ли в LightInject IoC решить тип, основанный на некотором обычном методе?Тип разрешения контейнера LightInject IoC по специальному методу?

например разрешителе бы вызвать метод как этот

public interface IMyType {} 
public class MyEvenType : IMyType {} 
public class MyOddType : IMyType {} 
public static int Foo;  

public static IMyType ResolveType() 
{ 
    if (Foo % 2 == 0) 
     return MyEvenType; 
    return MyOddType; 
} 

Как бы я написать метод container.Register так, что он вызывает вышеупомянутый метод для того, чтобы решить эту зависимость?

ответ

2

LightInject позволяет регистрировать определенные методы в качестве методов заводских решений, которые позволят вам построить свой тип при разрешении интерфейса.

public class MyTypeResolver 
{ 
    public static int Foo;  
    public static IMyType ResolveType() 
    { 
     if (Foo % 2 == 0) 
      return new MyEvenType(); 
     return new MyOddType(); 
    } 
} 

При регистрации интерфейса, вместо регистрации на конкретный тип, зарегистрируйтесь на заводском методе, который возвращает конкретный тип.

void Main() 
{ 
    var container = new LightInject.ServiceContainer(); 
    container.Register<IMyType>(factory => MyTypeResolver.ResolveType()); 

    var instance1 = container.GetInstance<IMyType>(); 
    instance1.Dump(); 

    MyTypeResolver.Foo = 1; 

    var instance2 = container.GetInstance<IMyType>(); 
    instance2.Dump(); 
} 

instance1 имеет конкретный тип MyEvenType и instance2 имеет конкретный тип MyOddType.

+0

Спасибо, что мог работать. Я вижу, что вы вернули экземпляр типа из распознавателя: 'return new MyEvenType();'. Является ли этот экземпляр тем, что вводится при разрешении зависимостей? –

+0

@JK. Это. Если вы изменили тест, чтобы вместо этого вводить статический int и выводили этот статический int в каждом конструкторе, увеличивая его между разрешениями, вы увидите, что он продолжает увеличиваться (что означает, что он разрешает соответствующий экземпляр return new MyEvenType(), и т.д). –