2012-01-11 62 views
1

我有以下登記:我如何註冊多個服務,在溫莎城堡的特定接口

container.Register(AllTypes.FromAssemblyContaining<ITabViewModel>().BasedOn<ITabViewModel>()); 

兩類:

public class StructureDecorationViewModel : NotificationObject, ITabViewModel 
{ 
... 
} 

public abstract class NotificationObject : INotifyPropertyChanged 
{ 
... 
} 

和兩個解析器:

serviceProvider.ResolveAll<System.ComponentModel.INotifyPropertyChanged>() 
serviceProvider.ResolveAll<ITabViewModel>() 

這兩個Resolvers都提供了StructureDecorationViewModel,我如何過濾註冊以便我只註冊ister ITabViewModel而不是INotifyPropertyChange?

回答

4

要註冊對抗只是一個接口,你通常會使用FirstInterface:

AllTypes 
    .FromAssemblyContaining<ITabViewModel>() 
    .BasedOn<ITabViewModel>() 
    .WithService 
    .FirstInterface(); 

然而,在這種情況下,你最終會與你對INotifyPropertyChanged的註冊服務,這是不是你想要的,因爲它採用主從第一界面基類(查看ServiceDescriptor類以查看還有哪些其他註冊可用)。

你需要的是選擇方法,它允許您定義要註冊對服務的類型或類型:如果你想使事情更通用有人寫一個擴展方法

AllTypes 
    .FromAssemblyContaining<ITabViewModel>() 
    .BasedOn<ITabViewModel>() 
    .WithService 
    .Select(typeof(ITabViewModel)); 

然而看起來在正在註冊的服務,並挑選出的第一界面上的派生類(http://www.hightech.ir/SeeSharp/windsor-registration-service-interface):

public static BasedOnDescriptor FirstInterfaceOnClass(this ServiceDescriptor serviceDescriptor) 
{ 
    return serviceDescriptor.Select((t, bt) => 
    { 
     var baseInterfaces = t.BaseType.GetInterfaces(); 
     var interfaces = t.GetInterfaces().Except(baseInterfaces); 

     return interfaces.Count() != 0 ? new[] {interfaces.First()} : null; 
    }); 
} 

,它允許你這樣做:

AllTypes 
    .FromAssemblyContaining<ITabViewModel>() 
    .BasedOn<ITabViewModel>() 
    .WithService 
    .FirstInterfaceOnClass(); 
+0

感謝您的幫助,兩種解決方案都運行良好。然而,我仍然從類型INotifyPropertyChanged的ResolveAll獲得服務。但升級到溫莎城堡的v3後,這種情況就消失了。 – 2012-01-12 11:17:02