2

クエリ文字列のパラメータを検査し、このIDに基づいてユーザーオブジェクトをロードし、リクエストDTOにそれを入力するプラグインを作成しました。(私のリクエストDTOはすべて、CurrentUserプロパティを持つBaseRequestから継承します)

public class CurrentUserPlugin : IPlugin
{
    public IAppHost CurrentAppHost { get; set; }

    public void Register(IAppHost appHost)
    {
        CurrentAppHost = appHost;
        appHost.RequestFilters.Add(ProcessRequest);
    }

    public void ProcessRequest(IHttpRequest request, IHttpResponse response, object obj)
    {
        var requestDto = obj as BaseRequest;

        if (requestDto == null) return;

        if (request.QueryString["userid"] == null)
        {
            throw new ArgumentNullException("No userid provided");
        }

        var dataContext = CurrentAppHost.TryResolve<IDataContext>();
        requestDto.CurrentUser = dataContext.FindOne<User>(ObjectId.Parse(requestDto.uid));

        if (requestDto.CurrentUser == null)
        {
            throw new ArgumentNullException(string.Format("User [userid:{0}] not found", requestDto.uid));
        }
    }
}

このUserオブジェクトをサービスで使用できるようにする必要がありますが、DTOを毎回検査して、そこから抽出したくありません。プラグインからのデータを私のサービスでグローバルに利用できるようにする方法はありますか?また、単体テストに関してこのオブジェクトをインスタンス化する別の方法があるかどうか疑問に思っています。プラグインは実行されません。サービスを直接呼び出すためです。

だから、私の質問は、プラグインを使用する代わりに、実行時にユーザーインスタンスをサービスに注入できますか?テストモードで実行しているかどうかに応じて、すでにIoCを使用してさまざまなデータベースハンドラーを挿入していますが、各リクエストの開始時にインスタンス化する必要があるUserオブジェクトに対してこれを実現する方法がわかりません。

以下は、appHostにDataContextを挿入する方法の例です。

container.Register(x => new MongoContext(x.Resolve<MongoDatabase>()));
container.RegisterAutoWiredAs<MongoContext, IDataContext>();

これが私のBaseServiceの例です。理想的には、サービスにもCurrentUserプロパティを設定したいと思います。

public class BaseService : Service
{
    public BaseService(IDataContext dataContext, User user)
    {
        DataContext = dataContext;
        CurrentUser = user; // How can this be injected at runtime?
    }

    public IDataContext DataContext { get; private set; }
    public User CurrentUser { get; set; }
}
4

3 に答える 3

1

IHttpRequest アイテム ディクショナリを使用してオブジェクトを格納しようと考えたことはありますか。これらの項目には、任意のフィルターまたはサービスから、または IHttpRequest にアクセスできる場所からアクセスできます。IHttpRequestの src を参照してください。

属性、サービス、およびプラグインが実行される順序と、Items ディクショナリに項目を保存するときに注意してください。

于 2013-03-19T17:37:06.613 に答える
0

この User オブジェクトをサービスで使用できるようにする必要がありますが、毎回 DTO を検査してそこから抽出する必要はありません

クエリ文字列で「userid」を渡さない場合、アプリケーションはどのようにしてユーザーについて知るのでしょうか? ユーザーデータをSessionに保存できますか? セッションを使用すると、クライアントがアプリに接続されていると想定され、「セッション データ」を取得するためにサーバーで検索できるセッション ID (ServiceStack の ss-id または ss-pid cookie) がクライアントに保持されます。セッションを使用できる場合は、次のような方法でサービスからデータを取得できます

base.Session["UserData"] or base.SessionAs<User>();

注:ユーザー データをセッションに保存する必要があります。

プラグインからのデータを自分のサービスでグローバルに利用できるようにする方法はありますか? しかし、各リクエストの開始時にインスタンス化する必要がある User オブジェクトに対してこれを達成する方法がわかりません。

これは、グローバル リクエスト フィルターが必要なようです。あなたはすでにこれをやっていますが、それをプラグインにラップしています。

于 2013-03-19T18:13:57.897 に答える