Ninjectフレームワークを使用してMVC3アプリを構築しています。初期化に時間がかかるサービスがあり、最後にこのサービスにはユーザー固有の情報を含むオブジェクトが含まれるため、ユーザーセッションがアクティブである限り、そのサービスを再利用する必要があります。そのサービスを何度も初期化することを避けることができます
だから私の質問は
Ninjectを使用してサービスをバインドする場合、どの種類のスコープを選択する必要がありますか?Ninjectにはスコープごとのセッションがないので、要件を実装するための最良の方法は何ですか?または私はまったく間違った方向に行きましたか?
現在のController.User.Identity.Nameから取得したユーザー名の詳細に基づいてサービスを作成するサービスの1つにカスタムプロバイダーを作成しました。userNameローカル変数がないため、以下のコードは機能しません。IContextから取得できるように、Ninjectを介してユーザー名の値をカスタムプロバイダーに渡すにはどうすればよいですか?
public class TfsConnectionManagerProvider : Provider<TfsConnectionManager>
{
protected override TfsConnectionManager CreateInstance(IContext context)
{
Uri serverUri = new Uri(ConfigurationHelper.TfsServerUrl);
// Connect to the server without impersonation
using (TfsTeamProjectCollection baseUserConnection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(serverUri))
{
// Get the identity management service
IIdentityManagementService ims = baseUserConnection.GetService<IIdentityManagementService>();
// Get the identity to impersonate
TeamFoundationIdentity identity = ims.ReadIdentity
(
IdentitySearchFactor.AccountName,
userName, //NOTE: How can I get user name value from IContext???
MembershipQuery.None,
ReadIdentityOptions.None
);
// Connect using the impersonated identity
using (TfsTeamProjectCollection impersonatedConnection = new TfsTeamProjectCollection(serverUri, identity.Descriptor))
{
WorkItemStore store = impersonatedConnection.GetService<WorkItemStore>();
return new TfsConnectionManager
{
Store = store
};
}
}
}
}