我正在使用 Ninject 框架构建一个 MVC3 应用程序。我有一个初始化耗时的服务,最后这个服务将有一个包含用户特定信息的对象,然后只要用户会话处于活动状态,我就需要重新使用该服务,这样我可以避免一次又一次地初始化那个服务
所以我的问题是
当我使用 Ninject 绑定服务时,我应该选择什么样的范围,Ninject 中没有每个范围的会话,那么实现需求的最佳方法是什么?还是我走错了方向?
我为我的一项服务创建了一个自定义提供程序,它将根据从当前 Controller.User.Identity.Name 获取的用户名详细信息创建服务。下面的代码将不起作用,因为缺少 userName 局部变量,如何通过 Ninject 将用户名值传递给我的自定义提供程序,以便我可以从 IContext 中获取它?
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
};
}
}
}
}