ASP.NET WebAPI 2 中的 Unity Entity Framework

Unity Entity Framework within ASP.NET WebAPI 2

我在这里遇到一个非常奇怪的 Unity 问题。我有以下内容:

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,InjectionFactory 中的代码偶尔会 运行 但不会在每次请求时出现。

我是否错误地配置了 Unity?有人遇到过类似情况吗?

提前致谢

问题很可能与您使用的LifetimeManager有关。 PerThreadLifetimeManager 不适用于 Web 上下文,因为线程被合并并将按顺序处理多个请求。

PerRequestLifetimeManager 可能是您要使用的。