2017-12-11 14 views
1

열려있는 제네릭 형식을 모두 기본 규칙으로 등록하려고합니다. 아래와 같이 기본 규칙을 사용하면 유형이 올바르게 등록되었는지 확인할 수 있습니다.구조체가 열린 제네릭을 기본 규칙으로 올바르게 등록 할 수 없습니다.

그러나 문제를 해결하려고하면 다음 오류가 발생합니다.

없음 기본 인스턴스가 등록되지 않고 자동으로 유형을 판별 할 수없는 'IGenericClass'여기

public DefaultRegistry() 
     { 
      Scan(
       scan => 
       { 
        scan.AssembliesFromApplicationBaseDirectory(
         a => a.FullName.StartsWith("StructureMapApp")); 
        scan.WithDefaultConventions(); 
       }); 
     } 

var container = new Container(x => 
    { 
     x.AddRegistry(new DefaultRegistry()); 

    }); 
    container.WhatDoIHave(); 

    var result = container.GetInstance<IGenericClass<DummyClass>>(); 

인 container.WhatDoIHave() container.WhatDoIHave를() 내가 enter image description here

을 등록하면 결과 명시 적으로 예상대로 작동합니다. 여기
 container.Configure(x => x.For(typeof(IGenericClass<>)).Use(typeof(GenericClass<>))); 
     var sad = container.GetInstance<IGenericClass<DummyClass>>(); 

는 기본 규칙으로 만든 두 registries.The 레지스트리 사이에 약간의 차이가 명시 동안 조립 및 모델 이름을 포함입니다 알다시피 container.WhatDoIHave는()

enter image description here

결과입니다 하나는 가지고 있지 않다.

enter image description here

어떤 자동차가없이 열려있는 모든 제네릭 등록 방법은 명시 적으로 그들 모두를 제공하는이 있습니까?

+0

DefaultRegistry 무엇으로 추가? – Evk

+0

그것을 잊어 버렸습니다. 추가했습니다. – erhan355

+0

제가 아는 한 - 기본 규칙은 그렇게하기위한 것이 아니며, 사용자 정의 regitration convention을 작성해야합니다. – Evk

답변

1

내가 아는 한, DefaultConvention은 그렇게하지 않습니다. 하지만 당신은 예를 들어, 사용자 정의 규칙을 만들 수 있습니다

class MapOpenGenericTypesToInterfacesConvention : IRegistrationConvention { 
    public void ScanTypes(TypeSet types, Registry registry) { 
     var openInterfaces = types.FindTypes(TypeClassification.Open | TypeClassification.Interfaces).ToArray(); 
     var openConcrete = types.FindTypes(TypeClassification.Open | TypeClassification.Concretes); 
     foreach (var type in openConcrete) { 
      foreach (var iface in openInterfaces) { 
       if (type.GetInterfaces().Where(c => c.IsGenericType).Any(ti => ti.GetGenericTypeDefinition() == iface)) { 
        registry.For(iface).Use(type); 
       } 
      } 
     } 
    } 
} 

그런

scan.With(new MapOpenGenericTypesToInterfacesConvention());