1

我在我的项目界面中有

public interface IUpdater
{
    void Update();
}

和一些实现UpdaterA, UpdaterB, UpdaterC 我也有装饰器DecoratorUpdater。所有这些类都实现了接口IUpdater,我需要配置 Windsor Castle 以在类中用作数组装饰的实现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

其他稍微短一点的解决方案

        Container.Register(
            Component.For<IUpdater>().ImplementedBy<DecoratorUpdater>().DependsOn(Dependency.OnComponent(typeof(IUpdater), typeof(UpdaterA))).Named("DecoratedUpdaterA").LifestylePerWebRequest(),
            Component.For<UpdaterA>().ImplementedBy<UpdaterA>().LifestylePerWebRequest(),
            Component.For<IUpdater>().ImplementedBy<DecoratorUpdater>().DependsOn(Dependency.OnComponent(typeof(IUpdater), typeof(UpdaterB))).Named("DecoratedUpdaterB").LifestylePerWebRequest(),
            Component.For<UpdaterB>().ImplementedBy<UpdaterB>().LifestylePerWebRequest(),
            Component.For<IUpdater>().ImplementedBy<DecoratorUpdater>().DependsOn(Dependency.OnComponent(typeof(IUpdater), typeof(UpdaterC))).Named("DecoratedUpdaterC").LifestylePerWebRequest(),
            Component.For<UpdaterC>().ImplementedBy<UpdaterC>().LifestylePerWebRequest());
于 2013-10-24T15:08:18.823 回答
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 回答
0

Ok, so better solution than mine isn't.

于 2013-10-16T19:43:30.050 回答