我沒有試過,但我認爲它應該工作...
您可以創建一個動作過濾器,將在HttpRequestMessage添加到當前分層容器,然後用註冊您的自定義的DbContext類型使用InjectionFactory來提取HttpRequestMessage並獲取數據庫名稱。
下面是一些未經測試的代碼...
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class RegisterHttpRequestActionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var container = GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IUnityContainer)) as IUnityContainer;
container.RegisterInstance(actionContext.Request, new HierarchicalLifetimeManager());
}
}
和配置...
IUnityContainer rootContainer = new UnityContainer();
GlobalConfiguration.Configuration.DependencyResolver = new UnityHierarchicalDependencyResolver(rootContainer);
GlobalConfiguration.Configuration.Filters.Add(new RegisterHttpRequestActionAttribute());
rootContainer.RegisterType<MyDbContext>(new HierarchicalLifetimeManager(), new InjectionFactory(container =>
new MyDbContext(container.Resolve<HttpRequestMessage>().Properties["TenantDB"] as string)));
(僅供參考,我引用Unity.AspNet.WebApi NuGet包拿到UnityHierarchicalDependencyResolver)
使用事實方法註冊。這樣你就可以提供明確的工廠方法。 –