我已经阅读并使用Google搜索了所有内容,但似乎无法让它发挥作用。我根据这些帖子在我的MVC5应用程序中为Unity创建了一个自定义LifetimeManager
:
这是我的SessionLifetimeManager
public class SessionLifetimeManager : LifetimeManager
{
private string key = Guid.NewGuid().ToString();
public override object GetValue()
{
return HttpContext.Current.Session[key];
}
public override void RemoveValue()
{
HttpContext.Current.Session.Remove(key);
}
public override void SetValue(object newValue)
{
HttpContext.Current.Session[key] = newValue;
}
}
我只有几种我正在玩的类型,这是 UnityConfig.cs 中的相关注册:
container.RegisterType<IEpiSession, EpiSession>(new SessionLifetimeManager(),
new InjectionConstructor(config.AppServerURI, config.PathToSysConfig));
container.RegisterType<IReportRepository, EpicorReportRepository>(new TransientLifetimeManager());
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
请注意,EpicorReportRepository
通过构造函数注入依赖于IEpiSession
。
public class EpicorReportRepository : IReportRepository
{
private IEpiSession session;
// DI constructor
public EpicorReportRepository(IEpiSession session) {
this.session = session;
}
// ...
}
我的问题:在第一个用户/会话连接到应用程序之后,之后的每个新用户/会话似乎仍在使用第一个用户拥有的EpiSession
对象和凭据为他创造/注入。这似乎是互联网上常用的模式,所以我想知道我错过了什么。
答案 0 :(得分:1)
您是如何测试IEpiSession
在Session
s中的SetResolver()
是否相同?
尝试从不同的浏览器打开您的应用程序。如果您在同一浏览器中打开多个选项卡,则会使用相同的会话。
我检查了你的代码,它对我有用。
DependencyResolver.SetResolver(
type => container.Resolve(type),
types => container.ResolveAll(types));
中只有一个区别:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
...
var container = new UnityContainer();
container.RegisterType<IEpiSession, EpiSession>(
new SessionLifetimeManager(),
new InjectionConstructor("config.AppServerURI", "config.PathToSysConfig"));
container.RegisterType<IReportRepository, EpicorReportRepository>(new TransientLifetimeManager());
DependencyResolver.SetResolver(
type => container.Resolve(type),
types => container.ResolveAll(types));
}
}
完整的注册码如下:
e.preventDefault();