试图解决温莎类型的问题

时间:2010-02-19 12:13:30

标签: castle-windsor

我的解决方案中有以下项目:


public interface IHandle<TEvent>
{
    void Handle(TEvent event);
}

public interface IPresenter<TView>
{
}

public abstract class Presenter<TView> : IPresenter<TView>
{
    protected view;

    public TView View
    {
        set { view = value;}
    }

    // snip...
}

public interface IMyPresenter : IPresenter<IChangeRequestReviewManagementView>
{
    // snip...
}

public class MyPresenter : Presenter<MyView>, IMyPresenter, IHandle<CustomEvent>
{
    // snip...
}

以下注册温莎注册主持人:


container.Register(AllTypes.Of(typeof(IPresenter<>))
                    .FromAssemblyNamed("Project.Presentation")
                    .WithService.Select((type, baseType) => new Type[] {GetInterfaceFromConvention(type)})
                    .Configure(config => config.LifeStyle.PerWebRequest));

private static Type GetInterfaceFromConvention(Type type)
{
    return (from found in type.GetInterfaces()
    where found.Name.Equals("I" + type.Name)
    select found).FirstOrDefault();
}

这非常有效,我可以使用以下方法解析页面中的演示者:


public IMyPresenter Presenter
{
    set
    {
        presenter = value;
    }
}

使用这个http://code.google.com/p/sneal/wiki/AspNetWindsorModule,当我尝试连接支持处理通过调用IHandle&lt;&gt;的实现者的单独EventAggregator提供的事件时,问题出现了。我添加了这个注册:


container.Register(AllTypes.Of(typeof(IHandle<>))
                    .FromAssemblyNamed("Project.Presentation")
                    .BasedOn(typeof(IHandle<>))
                    .WithService.Base());

因为这适用于实现IHandle&lt;&gt;的其他区域但是在添加之后,容器不能再将IMyPresenter解析为MyPresenter,所以我必须遗漏一些东西?!

1 个答案:

答案 0 :(得分:0)

好的,我现在看到问题是什么(或者至少我认为我做了 - 我自己没有运行代码)。

问题在于您通过让MyPresenter做两份工作来打破SRP。

然后,当您注册组件时,您尝试注册MyPresenter两次,第一次注册获胜(第二次注册时无法注册)。

要解决此问题,您应该重构MyPresenter来做一件事。这很可能要求您引入MyPresenterHandler MyPresenter来依赖{{1}}来完成其工作。

通过这种方式,您将没有冲突的注册,并且任何工作都应该正常工作。