2012-11-07 4 views
0

Autofac을 사용하려고 시도하고 있으며 매개 변수 중 하나를 선택적 매개 변수 (또는 null)로받는 ​​아래 클래스를 등록하려고합니다. 내 클래스는 다음과 같습니다선택적 매개 변수를 autofac에 전달하십시오.

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

여기 RECORDTYPE는 열거하고 SpanRecordAttribute입니다 내가 어떤 인터페이스를 생성하고 싶지 않은 전용 속성을 가진 클래스이다. 생성자에서

RECORDTYPE속성ISpanRecord 이 클래스는 프로그램의 다른 장소에서 다음과 같은 방법으로 인스턴스화 할 수있는 인터페이스의 두 공용 속성은 다음과 같습니다

ISpanRecord spanFileRecord = new BaseSpanRecord(recordType, null); 

또는

ISpanRecord spanFileRecord = new BaseSpanRecord(recordType, recordAttributeList); 

어떻게해야합니까? 위의 두 가지 경우를 처리 할 수 ​​있도록 utofac 컨테이너? 아니면 변경해야합니까? BaseSpanRecord 클래스가 등록하기 쉽도록 작성 되었습니까?

+0

나는 사용하여 시도 다음 'builder.RegisterType () UsingConstructor (대해서 typeof (RECORDTYPE), 대해서 typeof (목록 )) () .InstancePerDependency()으로,' 하지만.. 첫 번째 경우에는 작동하지 않습니다. – Darsin

답변

2

TypeParameter을 사용하면 유형 정보를 제공하는 한 인스턴스를 해결할 때 null이 좋을 것입니다. 등록시 UsingConstructor 방법을 사용할 필요가 없습니다. 직접

만들기 TypedParameter 인스턴스 다음 TypedParameter.From 도우미 메서드를 사용

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

다음 null이 도우미 메서드와 타입 추론 수 있도록 List<SpanRecordAttribute> 캐스팅되었다

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

알 수 있습니다.

+0

감사합니다. @Alex. 그것은 내 문제를 해결했다. 그러나 이제는 몇 가지 질문이 이어집니다. autofac이 등록하는 동안 생성자 매개 변수를 지정하지 않고 해결할 수있는 경우'UsingConstructor()'또는'WithParameter()'또는'builder.Register (c => new ClassA (c.Resolve ()))를 사용해야합니다. Autofac wiki에 쓰여진 내용을 많이 이해하지 못했기 때문에 Autofac에 대한 지식을 얻었습니다. 같은 시나리오에 대한 가능한 시나리오를 찾고 있습니다. 어떤 링크 나 책 등을 제공 할 수 있다면 정말 도움이 될 것입니다. – Darsin

관련 문제