1

ASP.NET での開発を始めたのはつい最近のことですが、C# を使用して数年になります。ASP.NET への最初のアプローチは MVC 4 を使用することでしたが、今ではプレーンな ASP.NET ページを使用するプロジェクトに取り組んでいます。一般的なフレームワークがどのように機能するかについて、私は途方に暮れています。

具体的には、ASP.NET ページに Decorator パターンを実装する方法がわかりません。Product.aspx ページがあり、それに機能を追加する必要があります。タスクの要件に基づいて Decorator パターンが最適であると考え、実行される実際のロジックはコントローラー アクションにあるため、MVC でそれを使用する方法をすぐに考え出しました。そこでデコレーター オブジェクトをインスタンス化します。

しかし、ASP.NET でそれを行う方法がわかりません。私が見る限り、ブラウザーが Product.aspx を要求すると、「何か」がクラス Product (Page から派生) のオブジェクトを作成し、それを装飾するには遅すぎます。

したがって、ASP.NET ページ全体 (コード ビハインドで使用されるオブジェクトだけでなく) を装飾することは可能ですか? どうすればいいですか?

4

2 に答える 2

2

何を飾りたいのかよくわかりませんが、

次のように、特定のリクエストで作業を行うことができる HttpHandler を作成できます。

public class MyHttpHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        if (context.Request.RawUrl.Contains("product.aspx"))
        {
            // may be you can execute your decorate business here
        }
    }

    public bool IsReusable { get { return false; } }
}

または、次のように Global.asax の OnBeginRequest イベントを使用することもできます

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterOpenAuth();
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        base.BeginRequest += OnBeginRequest;
    }

    private void OnBeginRequest(object sender, EventArgs e)
    {
        if (Request.RawUrl.Contains("product.aspx"))
        {
            //execute your business here..
        }
    }
于 2013-11-07T12:09:33.177 に答える
1

まず、質問の下のコメントによると、ショーケースを Web ユーザー コントロール (ascx) として実装する必要があると言えます。

ShowCase は次のように装飾できます。

public partial class ShowCase : System.Web.UI.UserControl, IShowCase
{
    protected void Page_Load(object sender, EventArgs e){}
    public void ApplyConfiguration(IConfiguration configuration)
    {
        throw new NotImplementedException();
    }
}

public interface IShowCase
{
    void ApplyConfiguration(IConfiguration configuration);
}

public abstract class Decorator : IShowCase
{
    protected IShowCase ShowCase;

    protected Decorator(IShowCase showcase)
    {
        ShowCase = showcase;
    }

    public virtual void ApplyConfiguration(IConfiguration configuration)
    {
        ShowCase.ApplyConfiguration(configuration);
    }
}

public class ShowCaseDecoratorA : Decorator
{
    public ShowCaseDecoratorA(IShowCase showcase) : base(showcase){ }

    public override void ApplyConfiguration(IConfiguration configuration)
    {
        base.ApplyConfiguration(configuration);
        //depending on the configuration, do something..
        ShowCase.Visible = false;
    }
}

public interface IConfiguration
{
    //configuration
}

次に、ShowCase ユーザー コントロールを使用するページ内から、次のようにします。

public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        IConfiguration configuration = ConfigurationFactory.Get();
        new ShowCaseDecoratorA(this.ShowCase).ApplyConfiguration(configuration);
    }
}

これがあなたにインスピレーションを与えることを願っています..

于 2013-11-07T13:04:28.413 に答える