2009-08-31 3 views
2

나는 Repository의 기본 클래스가 <T>입니다. 특정 프로젝트에서는이 기본 클래스의 여러 구현이 있습니다. 예 :StructureMap은 자손 클래스를 자동으로 등록합니다.

PersonRepository : Repository<T> 
EmployerRepository : Repository<T> 

지금 당장이 각 리포지토리를 StructureLap ServiceRegistry 클래스에 등록합니다. 다음과 같이하십시오 :

ForRequestedType<Repository<Person>>() 
    .TheDefaultIsConcreteType<PersonRepository>(); 
ForRequestedType<Repository<Employer>>() 
    .TheDefaultIsConcreteType<EmployerRepository>(); 

이 글은 저장소를 추가 할 때마다 등록해야한다는 것을 기억해야합니다. 한 걸음 더 나아.

PersonRepository가있는 프로젝트/어셈블리를 검색하고 Repository < T>에서 상속 한 모든 것을 등록 할 수있는 방법이 있습니까?

답변

3

EDIT : 최신 구조체를 다운로드했습니다. project's CI server에서 가져 왔습니다. 당신이 필요로하는 무엇 이제 포함되어 있으며 사용자 지정 규칙을 사용할 필요가 없습니다 :

public class RepositoryRegistry : Registry 
{ 
    public RepositoryRegistry() 
    { 
     Scan(assemblyScanner => 
      { 
       assemblyScanner.AssemblyContainingType<PersonRepository>(); 
       assemblyScanner.AddAllTypesOf(typeof (IRepository<>)); 
       assemblyScanner.ConnectImplementationsToTypesClosing(typeof(IRepository<>)); 
      }); 
    } 
} 

이 내 최초의 솔루션입니다 : 아마 좋은 출발점을하지만

는 정제 될 필요가 :

public class RepositoryRegistry : Registry 
{ 
    public RepositoryRegistry() 
    { 
     Scan(assemblyScanner => 
      { 
       assemblyScanner.AssemblyContainingType<PersonRepository>(); 
       assemblyScanner.AddAllTypesOf(typeof (IRepository<>)); 
       assemblyScanner.With<RepositoryConvention>(); 
      }); 
    } 
} 

public class RepositoryConvention : ITypeScanner 
{ 
    public void Process(Type type, PluginGraph graph) 
    { 
     var selectedInterface = 
      (from @interface in type.GetInterfaces() 
      where @interface.IsGenericType && 
        @interface.GetGenericTypeDefinition() 
         .IsAssignableFrom(typeof (IRepository<>)) 
      select @interface).SingleOrDefault(); 

     if(selectedInterface != null) 
      graph.Configure(registry => 
       registry.ForRequestedType(selectedInterface) 
        .TheDefaultIsConcreteType(type) 
      ); 
    } 
} 
+0

쿨! 감사! 나는 휴가에서 돌아올 때 이것을 2 주 안에 시도 할 것이다. –

관련 문제