Как мне использовать вложенные реализации интерфейсов в Castle Windsor? - PullRequest
4 голосов
/ 04 сентября 2011

Предположим, у меня есть интерфейс для извлечения данных и его реализация:

interface IResourceProvider
{
  string Get( Uri uri );
}

class HttpResourceProvider : IResourceProvider
{
  public string Get( Uri uri )
  {
    // Download via HTTP.
  }
}

Я могу зарегистрировать это в замке Виндзор следующим образом:

container.Register
  ( Component.For<IResourceProvider>().ImplementedBy<HttpResourceProvider>()
  );

(что нормально).

Если бы я тогда решил, что мне нужна реализация кэширования следующим образом:

class CachingResourceProvider : IResourceProvider
{
  public CachingResourceProvider( IResourceProvider resourceProvider )
  {
    _resourceProvider = resourceProvider;
  }

  public string Get( Uri uri )
  {
    // Return from cache if it exists.
    // Otherwise use _resourceProvider and add to cache.
  }

  private readonly IResourceProvider _resourceProvider;
}

Как мне зарегистрировать эти вложенные зависимости? то есть я хочу сказать, что IResourceProvider реализован с помощью CachingResourceProvider, кроме случаев, когда в конструкторе это HttpResourceProvider.

Ответы [ 2 ]

5 голосов
/ 04 сентября 2011

Просто зарегистрируйтесь CachingResourceProvider до HttpResourceProvider - например,

container.Register(Component
    .For<IResourceProvider>()
    .ImplementedBy<CachingResourceProvider>());
container.Register(Component
    .For<IResourceProvider>()
    .ImplementedBy<HttpResourceProvider>());

Кстати - это известно как Декоратор шаблон проектирования.

1 голос
/ 04 сентября 2011

Это называется шаблоном декоратора ...

См. Ссылку в качестве примера: http://mikehadlow.blogspot.com/2010/01/10-advanced-windsor-tricks-4-how-to.html

...