2010-03-23 59 views
3

考慮下面的類/接口:城堡溫莎流利登記:AllTypes和轉發類型

class Repository<T> : IRepository<T> {} 
class UserRepository : Repository<User>, IUserRepository {} 

有一個簡單的方法來改造這個:

container.Register(
    Component.For<IUserRepository>() 
     .Forward<IRepository<User>>() 
      .ImplementedBy<UserRepository>() 
    ); 

進入通過AllTypes自動登記?到目前爲止,我缺少類型轉發。

container.Register(
    AllTypes.FromAssemblyContaining(typeof(IUserRepository)) 
     .BasedOn(typeof(Repository<>)) 
     .WithService.Select((t, b) => new List<Type> { 
      t.GetInterfaces().Where(x => !x.IsGenericType).FirstOrDefault() 
     }) 
); 

但隨着類型轉發?因此,這將工作:

container.Resolve<IUserRepository>().GetType() == container.Resolve<IRepository<User>>().GetType() 

下面的代碼完全不是那麼回事,因爲FirstInterface()返回IRepository <用戶>:

container.Register(
    AllTypes.FromAssemblyContaining(typeof(IUserRepository)) 
     .BasedOn(typeof(Repository<>)) 
     .WithService.FirstInterface() 
); 

編輯:我是很接近,所以在我的情況:

container.Register(
    AllTypes.FromAssemblyContaining(typeof(IUserRepository)) 
     .BasedOn(typeof(Repository<>)) 
     .WithService.Select((t, b) => new List<Type> { 
      t.GetInterfaces() 
     }) 
); 

回答

3

,因爲我寫它從內存我可能不準確:

有」是一個WithService.Select過載。您可以傳遞返回IEnumerable的自定義方法。然後您可以使用它來相應地匹配您的類型。

+0

是的,在我寫下這個問題後不久就發現了! – mathieu