Как зарегистрировать несколько служб с определенным интерфейсом в замке Виндзор - PullRequest
1 голос
/ 11 января 2012

У меня есть следующая регистрация:

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>()

Оба этих преобразователя предоставляют StructureDecorationViewModel, как я могу отфильтровать регистрацию, чтобы я регистрировал только ITabViewModel, а не INotifyPropertyChange?

1 Ответ

4 голосов
/ 11 января 2012

Чтобы зарегистрироваться только на одном интерфейсе, вы обычно используете FirstInterface:

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

Однако в этом случае вы получите свою службу, зарегистрированную в INotifyPropertyChanged, а это не то, что вам нужно, поскольку она выбирает первый интерфейс из базового класса (посмотрите на класс ServiceDescriptor, чтобы увидеть, какие другие регистрации доступны).

Вам нужен метод Select, который позволяет вам определить тип или типы, для которых вы хотите зарегистрировать службу:

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();
...