我正在尝试使用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正在注册什么以及它注册了什么。无论如何这样做?
答案 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;