как я могу внедрить докладчика в представление без ссылки на докладчика - PullRequest
0 голосов
/ 28 января 2012

в классическом паттерне Passive-MVP, как я могу полностью избежать ссылки на презентатора в моем представлении и при этом добавить экземпляр презентатора, которому нужен экземпляр представления в качестве параметра.

с asp.net какпример:

  • мои реализованные представления (веб-проект) не должны иметь ссылку на докладчиков.(Ни IPresenter, ни конкретные)
  • когда создается экземпляр представления (в основном, моя веб-страница), экземпляр докладчика должен быть создан с использованием ссылки на текущее представление.
  • я использую единство в качестве iocконтейнер.

прямо сейчас, то, что я делаю в коде веб-страницы, это:

public partial class SomePage : MyBasePage, ISomeView
{
    private readonly ISomePresenter presenter;

    public SomePage()
    {
        this.presenter = ResolveSomeWay(this);
    }
}

для этого у меня есть ссылка на "DLL контрактов Presenter" на мой взглядреализация.Есть ли способ полностью избежать этой ссылки и при этом подключить докладчика к экземпляру представления, когда создается представление?

Я просто забочусь о создании экземпляра презентатора, так как конструктор презентатора может установить переданный параметр-представление-экземпляр к свойству View и он подписывается на события представления для любого будущего общения.

спасибо людям за ваше время.

1 Ответ

0 голосов
/ 03 марта 2012

Вы можете «опубликовать» новое представление, созданное для шины сообщений, с которой фабрика Presenter может «привязать» созданное представление к Presenter. Несмотря на то, что представление не зависит от докладчика, оно не относится к шине сообщений.

public partial class SomePage : MyBasePage, ISomeView
{
    // Alternative #1
    public SomePage(IMessageBus messageBus)
    {
        // You publish a message saying that a handler for ISomeView is to handle the
        // message.
        messageBus.Publish<ISomeView>(this);
    }
    // Alternative #2
    public SomePage()
    {
        Resolver.Resolve<IMessageBus>().Publish<ISomeView>(this);
    }
}

// This could be somewhere else in your application (this could be a separate DLL), but 
// I will use the Global.asax.cs here, for simplicity
public void Application_Start()
{
    Container.Resolve<IMessageBus>()
             .Subscribe<ISomeView>(someView => 
                 {
                    var presenter = new SomePresenter(someView);
                 });
}

public interface ISomeView {
    event Action<ISomeView> SomeEvent;
}

public class SomePresenter
{
    public SomePresenter(ISomeView view) {
        // if you attach the presenter to the View event, 
        // the Garbage Collector won't finalize the Presenter until
        // the View is finalized too
        view.SomeEvent += SomeEventHandler;
    }

    private void SomeEventHandler(ISomeView view) { 
       // handle the event
    }
}
...