1

私は自分のプロジェクトインターフェースに持っています

public interface IUpdater
{
    void Update();
}

そして、いくつかの実装UpdaterA, UpdaterB, UpdaterC にはデコレータもありDecoratorUpdaterます。これらのクラスはすべてインターフェイスIUpdaterを実装しており、クラスで装飾された配列として使用するためにウィンザー城を構成する必要がありますUpdaterService

私の解決策は次のとおりですが、どうすればよいかは簡単ではありません(現在、7つのアップデーターと2つのデコレーターがあります)

        // decorators
        Container.Register(
            Component.For<IUpdater, DecoratorUpdater>().LifestylePerWebRequest().Named("DecoratorUpdaterA").DependsOn(Dependency.OnComponent("underlyingUpdater", "NamedUpdaterA")),
            Component.For<IUpdater, DecoratorUpdater>().LifestylePerWebRequest().Named("DecoratorUpdaterB").DependsOn(Dependency.OnComponent("underlyingUpdater", "NamedUpdaterB")),
            Component.For<IUpdater, DecoratorUpdater>().LifestylePerWebRequest().Named("DecoratorUpdaterC").DependsOn(Dependency.OnComponent("underlyingUpdater", "NamedUpdaterC")));

        // updaters
        Container.Register(
            Component.For<IUpdater, UpdaterA>().LifestylePerWebRequest().Named("NamedUpdaterA"),
            Component.For<IUpdater, UpdaterB>().LifestylePerWebRequest().Named("NamedUpdaterB"),
            Component.For<IUpdater, UpdaterC>().LifestylePerWebRequest().Named("NamedUpdaterC"));

        // usages
        Container.Register(Component.For<UpdaterService>().ServiceOverrides(new
        {
            updaters = new[] 
            { 
                "DecoratedUpdaterA", 
                "DecoratedUpdaterB", 
                "DecoratedUpdaterC", 
            }
        }));

ウィンザー城を構成するより良い方法はありますか?

4

3 に答える 3

0

Ok, so better solution than mine isn't.

于 2013-10-16T19:43:30.050 に答える
0

一度に多くのコンポーネントを登録する方法があります。

たとえば、このアプリケーションのアセンブリにすべての IUpdator を登録し、それらをすべて PerWebRequest にして、次のように実装名に名前を付けることができます。

        container.Register(
            Classes.FromAssemblyInThisApplication()
                .BasedOn<IUpdator>()
                .Configure(registration => registration
                    .Named(registration.Implementation.Name)
                    .LifestylePerWebRequest()
                    ));

組み込みのキャッスル コレクション リゾルバーを使用すると、特定のタイプのすべてのコンポーネントをコンポーネントに受け取ることもできます。

次のようなクラスがあるとします。

    public class DecoratedComponent : IComponentThatNeedsAnArrayOfDecorators
    {
        public DecoratedComponent(IDecorator[] decorators)
        {

        }
    } 

次のように解決できます。

        IWindsorContainer container = new WindsorContainer();
        container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel));
        container.Register(
            Component.For<IComponentThatNeedsAnArrayOfDecorators>()
                .ImplementedBy<DecoratedComponent>());

        container.Resolve<IComponentThatNeedsAnArrayOfDecorators>();

装飾されたコンポーネントには、すべてのデコレーターが含まれています。

あなたが何をしようとしているのか正確にはわかりませんが、これらのような方法でクリーンアップできるように感じます.

于 2013-10-27T08:43:17.190 に答える