문제

나는 이런 인터페이스를 얻었다

public interface IWriter
{
  ...
}

그리고 수업

public class WriterMerger
{
  public WriterMerger(IEnumerable<IWriter> writers)
  ...
}

나는 StructureMap이 모든 등록 된 IWRITER의 WriterMerger의 생성자 인수를 작성하기를 원합니다. 나는 다른 작가들과 함께 등록했다

StructureMap.ObjectFactory.Initialize(x =>
{
  x.ForRequestedType<IWriter>().AddConcreteType<MemoryWriter>();
  x.ForRequestedType<IWriter>().AddConcreteType<FlatFileWriter>();
  x.ForRequestedType<IWriter>().AddConcreteType<DbWriter>();
}

그러나 전화

ObjectFactory.CreateInstance<WriterMerger>();

예외를 반환합니다 "PluginFamily System.collections.generic.ienumerable`1 [[iwriter ..]]에 대해 기본 인스턴스가 정의되지 않았습니다." (클래스 이름 편집)

이 작업을 자동으로 수행하기위한 트릭이 있습니까? 아니면 맞춤형 공장 방법을 만들어야합니까?

도움이 되었습니까?

해결책

유형의 모든 콘크리트 인스턴스를 주입하려면 매개 변수를 배열로 선언해야합니다. 생성자를 변경하여 문제를 해결할 수 있습니다.

public WriterMerger(IWriter[] writers)

Resharper와 같은 코드 정리 도구는 생성자의 배열을 강조 표시하고 WriterMerger가 요구하는 전부라면 ienumerable로 교체 할 것을 제안합니다. 그러나 이러한 도구는 배열을 사용하겠다는 StructureMap의 요구 사항을 알지 못하므로 무시해야합니다.

또한 명시 적으로 나열하는 대신 모든 iWriter를 자동으로 등록 할 수 있다는 사실에 관심이있을 수 있습니다. 컨테이너 구성 만 변경하십시오.

StructureMap.ObjectFactory.Initialize(x =>
{
    x.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.AddAllTypesOf<IWriter>();
    });
});

다른 어셈블리를 스캔하고 특정 유형을 제외 할 수있는 여러 가지 스캔 옵션이 있습니다.

다른 팁

실제로 이것은 생성자를 변경하지 않고 수행 할 수 있습니다

컨테이너 구성을 다음으로 변경하십시오.

StructureMap.ObjectFactory.Initialize(x =>
{
    x.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.AddAllTypesOf<IWriter>();
    });
    x.ForRequestedType<IEnumerable<IWriter>>()
        .TheDefault.Is.ConstructedBy(x => ObjectFactory.GetAllInstances<IWriter>());
});

나는 귀하의 문제를 복제했으며 iWriter 소비 클래스를 변경하면 IWRITER 배열을 가져 오는 CTOR를 갖도록 코드가 작동한다고 생각합니다.

public class WriterMerger {  public WriterMerger(IWriter[] writers) }

Josh는 모든 유형의 iWriter를 StructureMap에 등록하는 더 나은 방법을 추천하는 데 적합합니다. 스캐너 ftw.

이것이 당신에게 말하는 것은이 iWriters 중 하나를 기본값으로 정의해야한다는 것입니다. 다른 클래스에 다음과 같은 대조업이 있다고 상상해보십시오.

public class Test{
  public Test(IWriter writer){}
}

기본 iWriter가 없으면 어떤 작가를 할당 해야하는지 알 수 없습니다. 따라서 사용자가 절대 사용자를 사용하지 않더라도 어떤 기본값인지 말해야 할 것입니다. 이 게시물 참조 :

StructureMap의 AddConcretEtype과 TheDefaultisconCreteType의 차이점은 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top