2011-03-03 51 views
3

我有一些接口的所有接口:城堡温莎 - 注册与工厂方法

  • IFirstProvider
  • ISecondProvider
  • IThirdProvider
  • 等。

我想注册所有这些接口,以便他们使用工厂方法来获取实例:

container.Register 
    ( 
     AllTypes 
      .FromThisAssembly() 
      .Where(t => t.IsInterface && t.Name.EndsWith("Provider")) 
      .Configure(c => c.UsingFactoryMethod(f => f.Resolve<DictionaryAdapterFactory>().GetAdapter<object>(c.ServiceType, session)) 
    ); 

但这似乎不起作用。相反,我必须使用for循环注册所有这些接口:

List<Type> providers = new List<Type> 
    (
     Assembly 
      .GetExecutingAssembly() 
      .GetTypes() 
      .Where(x => x.IsInterface && x.Name.EndsWith("Provider")) 
    ); 

foreach (Type provider in providers) 
{ 
    Type temp = provider; 

    container.Register 
     (
      Component 
       .For(temp) 
       .UsingFactoryMethod(f => f.Resolve<DictionaryAdapterFactory>().GetAdapter<object>(temp, session)) 
     ); 
} 

有没有更好的方式来注册,除了使用for环路这些接口?

回答

3

有没有更好的内置的方式在温莎< 3.0

温莎3,你可以使用Types,而不是AllTypes做到这一点。

AllTypes的真正含义所有非抽象类

Types的真正含义所有类型。

是的,虽然这有点吸引人,并且违反直觉,但由于AllTypes排在第一位,我们无法改变其现有行为以维持向后兼容性。 为了保持理智,建议您使用Classes而不是AllTypes,因此您最终可以在类别中注册Classses,在您的问题中注册类似Types的案例。

+0

那么,这是不幸的。 – 2012-12-06 13:55:13

+0

@ tom.dietrich查看更新后的答案 – 2012-12-06 20:28:23

+0

好吧,那真是太棒了,除了现在我必须去改变一堆我改变的东西。 :) – 2012-12-13 23:11:48