Использование Autofac с ASP.NET и шаблоном MVP - PullRequest
1 голос
/ 11 января 2009

Я пытаюсь интегрировать Autofac в существующее веб-приложение ASP.NET.

Страницы соответствуют шаблону MVP. Каждая страница реализует функции просмотра и делегирования докладчику. Представление вводится в Presenter через конструктор.

Мне удалось зарегистрировать Presenter и View, и страница загружается нормально, но когда происходит обратная передача, пользовательские элементы управления в представлении становятся пустыми. Похоже, что Autofac создает новый экземпляр страницы, чтобы предоставить докладчику вместо того, чтобы дать ему экземпляр реального экземпляра страницы. Есть ли способ зарегистрировать экземпляры страниц в Autofac?

Кто-нибудь использовал Autofac с ASP.NET и MVP?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 декабря 2009

Есть лучший способ. Сначала включите модуль веб-интеграции . Это включит автоматическое внедрение свойств в экземпляр Page .

Поскольку вашему докладчику требуется представление в его конструкторе, ваша страница должна зависеть от докладчика фабрика вместо самого докладчика.

Итак, сначала вам нужна фабрика презентаторов, которая является делегатом с необходимыми параметрами:

public delegate IOCTestPresenter IOCTestPresenterFactory(IIOCTestView view);

Этот делегат должен соответствовать параметрам (типу и имени) конструктора презентатора:

public class IOCTestPresenter
{
     public IOCTestPresenter(IIOCTestView view)
     {
     }
}

По вашему мнению, добавьте свойство, получающее делегат фабрики, и используйте делегата для создания презентатора:

public partial class IOCTest
{
     public IOCTestPresenterFactory PresenterFactory {get;set;}

     protected void Page_Load(object sender, EventArgs e)    
     {
           var presenter = PresenterFactory(this);
     }
}

В настройках вашего контейнера вам нужно будет сделать следующие регистрации:

builder.Register<IOCTestPresenter>().FactoryScoped();
builder.RegisterGeneratedFactory<IOCTestPresenterFactory>();
0 голосов
/ 12 января 2009

Я нашел решение. По сути, вы должны зарегистрировать экземпляр страницы во время события Page_PreInit, а затем вызвать контейнер для внедрения зависимостей. Ex.

public partial class IOCTest : System.Web.UI.Page, IIOCTestView
{

    protected void Page_PreInit(object sender, EventArgs e)
    {
        var containerProviderAccessor = (IContainerProviderAccessor)HttpContext.Current.ApplicationInstance;
        var containerProvider = containerProviderAccessor.ContainerProvider;

        var builder = new ContainerBuilder();
        builder.Register(this).ExternallyOwned().As<IIOCTestView>();

        builder.Build(containerProvider.RequestContainer);

        containerProvider.RequestContainer.InjectProperties(this);
    }

    public IOCTestPresenter Presenter { get; set; }

Я не уверен, что есть лучший способ, но это похоже на работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...