LightInject IoC容器通过自定义方法解析类型?

时间:2015-05-14 22:52:26

标签: c# inversion-of-control solid-principles light-inject dependency-resolver

是否可以在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方法以便调用上述方法以解决依赖关系?

1 个答案:

答案 0 :(得分: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的具体类型为MyEvenTypeinstance2的具体类型为MyOddType