2009-08-31 64 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

酷!謝謝!當我從假期回來時,我會在幾個星期內嘗試一下。 – 2009-09-02 23:47:47