2

クライアントにjavascript(Extを使用)とサーバーに.NETがあるRIAアプリケーションを開発しています。json-rpcには、(少なくとも私にとっては)優れたライブラリであるJayrockを使用しています。シンプルでうまく機能します、私は過去にそれを使用しました。

JayrockはWebハンドラーを使用してjson-rpcリクエストを処理し、IHttpHandlerを実装し、いくつかの属性を持つJayrockクラスから派生するクラスをコーディングし、残りはブラウザーにjavascriptクラスを提供してその魔法を実行します。

これで、通常、Webハンドラーにはパラメーターのないコンストラクターがありますが、それらにDIを使用し、windsorを使用して依存関係を解決したいと思います。

だから、私は次のようないくつかのクラスを持っています

    public class VistaEntidadSimpleServer :  JsonRpcVistaHandler ,IHttpHandler
{
    public VistaEntidadSimpleServer(ISomeDependecy someObject)
    {
                 someObject.doSomething();

    }


    [JsonRpcMethod("Aceptar")]
    public string Aceptar (IVista vista)
    {
        throw new NotImplementedException ();
    }


    [JsonRpcMethod("Cancelar")]
    public string Cancelar (IVista vista)
    {
        throw new NotImplementedException ();
    }


    public IVista CargarDatos(IVista vista)
    {
        throw new System.NotImplementedException();
    }

}

だから、今問題は、解決を行うためにウィンザーを真ん中に置く方法です。周りを検索した後、春のように見えることから、IHttpHandlerFactoryを試して、次のようにコーディングできると思います

    public class CastleWindsorHttpHandlerFactory : IHttpHandlerFactory
{
    public CastleWindsorHttpHandlerFactory ()
    {
        if (container==null)
        container=(IWindsorContainer)HttpRuntime.Cache.Get("Container");
    }

    #region IHttpHandlerFactory implementation

    public IHttpHandler GetHandler (HttpContext context, string requestType, string url, string pathTranslated)
    {
        return container.Resolve<IHttpHandler>(url);
    }

    public void ReleaseHandler (IHttpHandler handler)
    {
        container.Release(handler);
    }

    #endregion

    private static IWindsorContainer container=null;
}

ashxファイルにファクトリを使用するようにWebアプリを構成し、global.asaxにコンテナーを作成し、URLをIDとしてハンドラーを構成し、コンテナーをWebキャッシュに登録します。

これは素晴らしい解決策だと思いますか?または、ここで欠けているものがありますか?コンテナーによってWebハンドラーを解決する別の方法はありますか?

進歩してくれてありがとう

4

1 に答える 1

2

コンテナをキャッシュに保存する代わりにIContainerAccessor、グローバルHttpApplicationに実装してコンテナを参照します。に参照を保存する必要はありませんCastleWindsorHttpHandlerFactory

それ以外はよさそうです。

于 2011-03-21T23:04:32.933 に答える