ASP.NET WebAPI 2中的Unity Entity Framework

时间:2015-08-04 07:08:59

标签: entity-framework asp.net-web-api unity-container

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

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?有没有人遇到类似的东西?

提前致谢

1 个答案:

答案 0 :(得分:1)

问题很可能与您使用的LifetimeManager有关。 PerThreadLifetimeManager未在Web上下文中进行调整,因为线程已合并,并将按顺序提供多个请求。

PerRequestLifetimeManager可能是你想要使用的。