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