2009-02-05 151 views
9

泛型類型StructureMap自動註冊我有一個接口:使用掃描

IRepository<T> where T : IEntity 

,而即時通訊使用一些假信息庫實現,剛剛返回任何舊的數據敲開了我的UI IM。

他們看起來像這樣:

public class FakeClientRepository : IRepository<Client> 

目前IM這樣做:

ForRequestedType<IRepository<Client>>() 
    .TheDefaultIsConcreteType<FakeRepositories.FakeClientRepository>(); 

我所有IEntities負荷次,但。是否有可能使用掃描自動註冊所有我的假的存儲庫爲其各自的IRepository?

編輯:這是據我得到的,但我得到的錯誤說法請求類型的心不是註冊:(

Scan(x => 
{ 
    x.TheCallingAssembly(); 
    x.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>(); 
    x.AddAllTypesOf(typeof(IRepository<>)); 
    x.WithDefaultConventions(); 
}); 

感謝

安德魯

回答

13

有一個更簡單的方法來做到這一點。請參閱本博客中的詳細信息:Advanced StructureMap: connecting implementations to open generic types

public class HandlerRegistry : Registry 
{ 
    public HandlerRegistry() 
    { 
     Scan(cfg => 
     { 
      cfg.TheCallingAssembly(); 
      cfg.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>(); 
      cfg.ConnectImplementationsToTypesClosing(typeof(IRepository<>)); 
     }); 
    } 
} 

這樣做,這樣避免了必須創建自己的ITypeScanner或約定。

6

謝謝Chris,這正是我所需要的。爲了清楚起見,繼承人我d編號從您的鏈接:

Scan(x => 
{ 
    x.TheCallingAssembly(); 
     x.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>(); 
    x.With<FakeRepositoryScanner>(); 
}); 


private class FakeRepositoryScanner : ITypeScanner 
{ 
    public void Process(Type type, PluginGraph graph) 
    { 
     Type interfaceType = type.FindInterfaceThatCloses(typeof(IRepository<>)); 
     if (interfaceType != null) 
     { 
      graph.AddType(interfaceType, type); 
     } 
    } 
}