2012-02-17 28 views
2

私は次のセットアップしている場合:城ウィンザーオート複数のインタフェースの登録とそれに対応する実装

public interface IUsersQuery{} 

public class UsersQuery : IUsersQuery {} 

public interface ICompanyQuery{} 

public class CompanyQuery : ICompanyQuery {} 

をそれが自動すべてIABCQueryとその対応する実装ABCQuery 1つのショットではなく、ずつやって登録することが可能です1:私は、インターフェイスに

public interface IEnhancedQuery {} 

public interface IUsersQuery : IEnhanceQuery {} 

public interface ICompanyQuery : IEnhancedQuery {} 
のマーカーのいくつかの並べ替えを追加する場合

container.Regsiter(
    Component.For<ICompanyQuery>().ImplementedBy<CompanyQuery>(), 
    Component.For<IUsersQuery>().ImplementedBy<UsersQuery>() 
) 

私は多分考えていました

私はそれを行うことができるかもしれませんが、私はAllTypesによる自動登録でそれらをすべて登録するのに苦労しています。

 container.Register(AllTypes.FromThisAssembly().BasedOn<IEnhancedQuery>()); 
     var iQueries = container.ResolveAll<IEnhancedQuery>(); 
     foreach (IEnhancedQuery p in iQueries) 
     { 
      var actualInterface = // how to get the actual interface type of p; 

      // would the following work? 
      container.Register(Component.For(actualInterface) 
       .ImplementedBy(AllTypes.FromThisAssembly().BasedOn(actualInterface) 
       .WithService.FirstInterface())); 
     } 

答えて

-1

キャッスルに自動登録機能があるかどうかはわかりませんが、リフレクションを使用して実装することはできますか。

それを行うのは非常に難しい作業は思えません。自分の名前が応じて、このインターフェイスで使用可能なタイプがありますかどうかを確認するために、クエリ

2.Checkで終わるすべてのインターフェイス

1.Findをあなたのルールに

3.タイプが存在する場合、コンポーネントを登録します。

2
container.Register(
    Classes.FromThisAssembly() 
     .Where(Component.IsInTheSameNamespaceAs<IUsersQuery>()) 
     .WithServiceDefaultInterfaces() 
     .LifestyleTransient() 
); 

The documentation詳細すべてのオプション。

+0

「Container.Register(AllTypes.FromThisAssembly()。BasedOn c.LifeStyle.Is(LifestyleType.Transient))); 'Then IUsersQuery - > UserQueryをコンテナに入れます。 – Liao

+1

具体的なタイプで自動的に名前を付ける方法はありますか? –

関連する問題