Проблема при попытке решить тип в Виндзоре - PullRequest
0 голосов
/ 19 февраля 2010

У меня есть следующие элементы в моем решении:


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, проблема возникает, когда я пытаюсь подключить поддержку обработки событий, предоставляемую через отдельный EventAggregator, который вызывает реализации IHandle <>.Я добавил эту регистрацию:


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

Поскольку это работает для других областей, которые реализуют IHandle <>, но после добавления этого контейнера контейнер больше не может разрешать IMyPresenter в MyPresenter, поэтому я должен что-то упустить?

1 Ответ

0 голосов
/ 19 февраля 2010

Хорошо, теперь я вижу, в чем проблема (или, по крайней мере, я полагаю, что сделал - сам не запускал код).

Проблема в том, что вы нарушаете SRP, заставляя MyPresenter выполнять две работы.

Затем, когда вы регистрируете свои компоненты, вы пытаетесь зарегистрировать MyPresenter дважды, и первая регистрация выигрывает (второй раз, когда она не будет зарегистрирована).

Чтобы исправить это, вы должны рефакторинг MyPresenter, чтобы сделать только одну вещь. Скорее всего, для этого потребуется ввести MyPresenterHandler, который будет зависеть от MyPresenter, чтобы выполнять свою работу.

Таким образом, у вас не будет конфликтующих регистраций, и все должно работать просто отлично.

...