我的解决方案中有以下项目:
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,所以我必须遗漏一些东西?!
答案 0 :(得分:0)
好的,我现在看到问题是什么(或者至少我认为我做了 - 我自己没有运行代码)。
问题在于您通过让MyPresenter
做两份工作来打破SRP。
然后,当您注册组件时,您尝试注册MyPresenter
两次,第一次注册获胜(第二次注册时无法注册)。
要解决此问题,您应该重构MyPresenter
来做一件事。这很可能要求您引入MyPresenterHandler
MyPresenter
来依赖{{1}}来完成其工作。
通过这种方式,您将没有冲突的注册,并且任何工作都应该正常工作。