2009-08-31 4 views
2

У меня есть базовый класс репозитория <T>. В конкретном проекте у меня есть несколько прецедентов этого базового класса. напримерStructureMap автоматически регистрирует классы потомков

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

В настоящее время я регистрирую каждый из этих репозиториев в классе StructureMap ServiceRegistry. например:

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

Это отстой, потому что каждый раз, когда я добавляю репозиторий, я должен запомнить его. Это еще один шаг.

Есть ли способ, которым я мог бы искать проект/сборку, где находится PersonRepository, и регистрировать все, что наследуется от репозитория < T>?

ответ

3

EDIT: Я только что скачал новую конструкцию StructureMap от 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

Прохладный! Благодаря! Я попробую это через пару недель, когда вернусь из отпуска. –

Смежные вопросы