获取Autofac以返回通用摘要而不是具体类

时间:2012-02-02 20:46:16

标签: .net generics autofac

我正在尝试使用Autofac自动启动我的应用程序。一切都很好,除了我有一个抽象的泛型类型,如:

public abstract class Transformer<TModel>
{
  // Some abstract methods
}

将其实施为:

public class EventTransformer : Transformer<Event>
{
  // implementation of methods
}

我正在通过以下方式自动启动应用程序:

builder.RegisterAssemblyTypes(typeof (MyAssemblyName).Assembly)
    .InstancePerLifetimeScope();

Autofac将在解析此类类时抛出错误:

public class RandomClass<TModel>
{ 
  public RandomClass(Transformer<TModel> transformer() 
  {
     // Constructor code
  }
}

我收到以下错误(简化)。我可以手动注册EventTransformer作为Transformer&lt;活动&gt;一切正常,但我不想手动注册,我应该能够自动完成,所以我可以简单地创建一个新的类,直接进入应用程序。

The requested service Transformer`1[[Event]]' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.

我确实尝试使用方法.AsImplementedInterfaces()在注册类时但似乎没有用。

那么我该怎么做才能做到这一点?另外,对于奖励积分,我无法知道Autofac正在注册什么以及它注册了什么。无论如何这样做?

1 个答案:

答案 0 :(得分:4)

您需要在open generic types期间使用AsClosedTypesOf方法注册assembly scanning

builder.RegisterAssemblyTypes(typeof(MyAssemblyName).Assembly)
    .InstancePerLifetimeScope();
builder.RegisterAssemblyTypes(typeof(MyAssemblyName).Assembly)
    .AsClosedTypesOf(typeof(Transformer<>))
    .InstancePerLifetimeScope();

您可以通过以下方式获取已注册的组件:

IContainer container = builder.Build();
var registrations = container.ComponentRegistry.Registrations;