1

Autofac を既存の ASP.NET Web アプリケーションに統合しようとしています。

ページは MVP パターンに従います。各ページはビューを実装し、機能をプレゼンターに委任します。ビューは、コンストラクターを介してプレゼンターに注入されます。

プレゼンターとビューを登録でき、ページは正常に読み込まれましたが、ポストバックが発生すると、ビューのユーザー コントロールが null になります。Autofac は、インスタンスに実際の Page インスタンスを与えるのではなく、プレゼンターに与える Page の新しいインスタンスを作成するようです。Page インスタンスを Autofac に登録する方法はありますか?

ASP.NET と MVP で Autofac を使用している人はいますか?

ありがとう!

4

2 に答える 2

2

もっと良い方法があります。まず、 Web 統合モジュールを有効にします。これにより、 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>();
于 2009-12-02T22:55:07.127 に答える
0

私は解決策を考え出しました。基本的には、Page_PreInit イベント中にページ インスタンスを登録し、コンテナーを呼び出して依存関係を注入します。元。

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; }

もっと良い方法があるかどうかはわかりませんが、これはうまくいくようです。

于 2009-01-12T19:17:01.840 に答える