2012-02-02 28 views
0

我试图使用Autofac自动编写我的应用程序。一切都很好除了事实上,我有一个抽象的泛型类型,如:Get 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 < Event>,一切工作正常,但我不想手动注册它,我应该可以自动完成它,所以我可以简单地创建一个新类,它直接进入应用。

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正在注册什么,以及它是如何注册的。有没有这样做?

回答

4

您需要在assembly scanning注册open generic typesAsClosedTypesOf方法:

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

而且你可以得到注册的组件:

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

美丽,谢谢。 – 2012-02-03 10:05:58