2012-11-07 81 views
0

我正在尝试使用Autofac并注册下面的类,它接收参数之一作为可选参数(或者更确切地说是null)。 我的类别是:将可选参数传递给autofac

class BaseSpanRecord : ISpanRecord 
{ 
    public BaseSpanRecord(RecordType recordType, List<SpanRecordAttribute> properties) 
    { 
     RecordType = recordType; 
     Properties = properties; 
    } 
} 

这里记录类型是一个枚举和SpanRecordAttribute是只为我不希望创建任何接口属性的类。

在构造记录类型属性是接口ISpanRecord 这个类可以在程序中的不同地方通过以下方式进行实例化的两个公共属性:

ISpanRecord spanFileRecord = new BaseSpanRecord(recordType, null); 

ISpanRecord spanFileRecord = new BaseSpanRecord(recordType, recordAttributeList); 

我该如何尝试在A utofac容器,以便它可以处理上述两种情况? 或者我应该改变方式BaseSpanRecord类已被写入使其注册更容易?

+0

我尝试使用以下: 'builder.RegisterType ()UsingConstructor(typeof运算(记录类型), typeof运算(列表))作为().InstancePerDependency();' 但随后。它不适用于第一种情况。 – Darsin

回答

2

当使用TypeParameter来解析实例时,只要您提供类型信息null应该没问题。您不需要在注册时使用UsingConstructor方法。

创建TypedParameter情况下直接:

var recordTypeParam = new TypedParameter(typeof(RecordType), RecordType.Something); 
var propertiesParam = new TypedParameter(typeof(List<SpanRecordAttribute>), null); 
var record = container.Resolve<ISpanRecord>(recordTypeParam, propertiesParam); 

使用TypedParameter.From helper方法:

var record = container.Resolve<ISpanRecord>(TypedParameter.From(RecordType.Something), TypedParameter.From((List<SpanRecordAttribute>)null)); 

注意,null被摔List<SpanRecordAttribute>允许用辅助方法类型推断。

+0

谢谢@Alex。它解决了我的问题。但是现在有几个问题。什么时候应该使用'UsingConstructor()'或'WithParameter()'或'builder.Register(c => new ClassA(c.Resolve ()))'当autofac可以在注册时不指定构造函数参数的情况下解析构造函数参数。请原谅我对Autofac的了解,因为我无法理解Autofac wiki上写的内容。我正在寻找相同的可能场景。如果你可以提供任何链接或书籍等,那么这将是非常有益的。 – Darsin