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
可能是您要使用的。
我在这里遇到一个非常奇怪的 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
可能是您要使用的。