Реализация и решение многих сервисных декораторов в замке Виндзор - PullRequest
1 голос
/ 05 мая 2010

Я новичок в замке Виндзор, поэтому я не уверен, что лучше всего подойдет в следующих случаях: У меня есть сервисный интерфейс (ILoader), который реализован несколькими классами Loader. У меня также есть реализация ILoader, это декоратор:

public interface ILoader { }
public class LoaderImpl0 : ILoader { }
public class LoaderImpl1 : ILoader { }
public class CachedLoader : ILoader
{
    public CachedLoader(ILoader inner) { }
}

Для каждого класса LoaderImpl ... я хочу зарегистрировать CachedLoader в своем контейнере, который украшает экземпляр LoaderImpl ....

Вот моя первая попытка мусора:

container.Register
(
    Component.For<LoaderImpl0>().Named("loader0"),
    Component.For<LoaderImpl1>().Named("loader1"),
    Component
    .For<ILoader>( )
    .ImplementedBy<CachedLoader>( )
    .ServiceOverrides( ServiceOverride.ForKey( "inner" ).Eq( "loader0" ) )
    .Named("cachedLoader0"),
    Component
    .For<ILoader>()
    .ImplementedBy<CachedLoader>()
    .ServiceOverrides(ServiceOverride.ForKey("inner").Eq("loader1"))
    .Named("cachedLoader1")
);

Это только кажется неправильным, на 2 счета:

  • container.ResolveAll<ILoader>() возвращает все 4 зарегистрированных загрузчика (хотя я не зарегистрировал классы LoaderImpl ... с помощью службы ILoader).
  • Кажется, что это очень неуклюжий способ определить, что является очень распространенным вложенным отношением - меня не волнуют классы LoaderImpl ..., они должны быть анонимными.

Может кто-нибудь просветить меня, где я иду не так?

...