我在这里遇到一个非常奇怪的问题。我有以下内容:
public class UnityConfig
{
public static void RegisterTypes(IUnityContainer container)
container.RegisterType<IDBContext, MyDbContext>(new PerThreadLifetimeManager());
container.RegisterType<IUserDbContext>(new PerThreadLifetimeManager(), new InjectionFactory(c =>
{
var tenantConnectionString = c.Resolve<ITenantConnectionResolver>().ResolveConnectionString();
return new UserDbContext(tenantConnectionString);
}));
}
}
然后在Reigster方法中的WebApiConfig.cs文件中:
var container = new UnityContainer();
UnityConfig.RegisterTypes(container);
config.DependencyResolver = new UnityResolver(container);
基本上,我想在上面的代码中发生的是每次请求API,我希望Unity基于用户(多租户类型的环境)新建UserDbContext。现在,TenantConnectionResolver负责计算连接字符串,然后我使用该连接字符串来新建UserDbContext。
另请注意(上面未显示)TenantConnectionResolver在其构造函数中采用IDbConext,因为我需要它根据该数据库中的用户信息找出连接字符串。
但由于某种原因,InjectionFactory中的代码随机运行。例如,我从浏览器中重复调用//mysite.com/controller/action/1,InitialFactory中的代码偶尔会运行但不会在每个请求上运行。
我是否错误地配置Unity?有没有人遇到类似的东西?
提前致谢
答案 0 :(得分:1)
问题很可能与您使用的LifetimeManager
有关。 PerThreadLifetimeManager
未在Web上下文中进行调整,因为线程已合并,并将按顺序提供多个请求。
PerRequestLifetimeManager
可能是你想要使用的。