クエリ文字列のパラメータを検査し、この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; }
}