1

问题

我有许多具有两个类型参数的具体泛型类,它们实现了具有一个类型参数的泛型接口。例如:

public interface ISomeService<T>
{
    // ...
}

public class SomeService<TA, TB> : ISomeService<TA>
{
    // ...
}

我像这样使用 Autofac 注册它们:

var containerBuilder = new ContainerBuilder();

containerBuilder.RegisterGeneric(typeof(SomeService<,>))
    .As(typeof(ISomeService<>))
    .InstancePerLifetimeScope();

var container = containerBuilder.Build();

当尝试解决这样的实例时ISomeService<Foo>

var service = container.Resolve<ISomeService<Foo>>();

我收到一个Autofac.Core.Registration.ComponentNotRegisteredException异常,说请求的服务ISomeService`1[[Foo]]尚未注册。

问题

  1. 我想用 Autofac 做的事情是不可能的吗?
  2. 如果是这样,是否有解决方法?
  3. 如果没有,其他 DI 容器是否提供这种能力,例如 SimpleInjector?
4

1 回答 1

2

使用 Simple Injector,您可以注册一个部分封闭的泛型类型,如下所示:

container.Register(typeof(ISomeService<>),
    typeof(SomeService<,>).MakeGenericType(
        typeof(SomeService<,>).GetGenericArguments().First(),
        typeof(Bar)),
    Lifestyle.Scoped);

没有其他 DI 库可以处理这个问题,但在这种情况下,对于 Autofac 等容器有一个简单的解决方法;您可以简单地从类型派生:

public class BarSomeService<TA> : SomeService<TA, Bar>
{
    public BarSomeService([dependencies]) : base([dependencies]) { }
}

containerBuilder.RegisterGeneric(typeof(BarSomeService<>))
    .As(typeof(ISomeService<>))
    .InstancePerLifetimeScope();
于 2016-10-06T20:12:45.940 回答