使用Autofac解析通用接口

Dow*_*pel 31 c# autofac

鉴于以下代码,如何在autofac中解析正确的SomeInstance?

public class BaseClass {}

public class SubClass1 : BaseClass {}

public class SubClass2 : BaseClass {}

public interface IGenericInterface<T> where T : BaseClass {}

public class SomeInstance1<T> : IGenericInterface<T> where T : SubClass1

public class SomeInstance2<T> : IGenericInterface<T> where T : SubClass2
Run Code Online (Sandbox Code Playgroud)

我想根据子类的泛型类型选择SomeInstance1或2.

所以例如我有一个子类的集合(SubClass1,2 ....),并在迭代它们时我想选择正确的SomeInstance类.

and*_*nov 66

Autofac支持开放式泛型.如果在编译时已知泛型类型,则可以使用以下代码:

var builder = new ContainerBuilder();

builder.RegisterGeneric(typeof(SomeInstance1<>))
  .As(typeof(IGenericInterface<>));              

var container = builder.Build();

var instance1 = container.Resolve<IGenericInterface<SubClass1>>();

Assert.IsInstanceOfType(typeof(SomeInstance1<SubClass1>), instance1);
Run Code Online (Sandbox Code Playgroud)

如果直到运行时才知道type参数(如果你想迭代类型集合,可能就是这种情况),那么你可以使用MakeGenericType构建你的类型:

        var typeInRuntime = typeof (SubClass1);
        var instance1 = container.Resolve(typeof(IGenericInterface<>).MakeGenericType(typeInRuntime));
Run Code Online (Sandbox Code Playgroud)