2009-08-31 8 views
2

私はリポジトリ<の基底クラスT >を持っています。特定のプロジェクトでは、この基本クラスの実装がいくつかあります。例えばStructureMapは自動的に子孫クラスを登録します

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

今は、これらのリポジトリをそれぞれStructureMap ServiceRegistryクラスに登録しています。

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

私がリポジトリを追加するたびに、登録することを忘れないでください。これはもう一つのステップです。

PersonRepositoryが配置されているプロジェクト/アセンブリを検索し、Repository <T>から継承したすべてを登録する方法はありますか?

答えて

3

編集:私はproject's CI serverからStructureMapの最新ビルドをダウンロードしました。あなたが必要なもの は、現在含まれており、カスタム規則を使用する必要はありませんされています

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

クール!ありがとう!私は休暇から戻ってくるときにこれを数週間で試してみます。 –

関連する問題