Entity framework 如何使Unity根据Web API请求传递构造函数参数?

Entity framework 如何使Unity根据Web API请求传递构造函数参数?,entity-framework,asp.net-web-api,unity-container,asp.net-web-api2,Entity Framework,Asp.net Web Api,Unity Container,Asp.net Web Api2,我正在多租户环境中使用Web API。每个租户都有自己的数据库,具有相同的结构。租户名称作为子域包含在URL中:http://{tenant}.mysite.com/api/doodad/action 我编写了一个消息过滤器(DelegatingHandler)来提取租户名称并找到相应的数据库。我目前正在请求参数中存储此值 几乎每个控制器操作都需要访问指向此数据库的DbContext。我没有使用存储库模式。我在DbContext上创建了第二个构造函数,它接受数据库名称 我使用Unity在Apic

我正在多租户环境中使用Web API。每个租户都有自己的数据库,具有相同的结构。租户名称作为子域包含在URL中:http://{tenant}.mysite.com/api/doodad/action

我编写了一个消息过滤器(DelegatingHandler)来提取租户名称并找到相应的数据库。我目前正在请求参数中存储此值

几乎每个控制器操作都需要访问指向此数据库的DbContext。我没有使用存储库模式。我在DbContext上创建了第二个构造函数,它接受数据库名称


我使用Unity在ApicController中注入DbContext的实例。如何让Unity调用DbContext上的第二个构造函数,并从请求参数传入值?

我还没有尝试过这个方法,但我认为它应该可以工作

您可以创建一个操作筛选器,将HttpRequestMessage添加到当前层次结构容器中,然后向InjectionFactory注册自定义DbContext类型,以提取HttpRequestMessage并获取DB名称

这里有一些未经测试的代码

[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)));
IUnityContainer rootContainer=newunitycontainer();
GlobalConfiguration.Configuration.DependencyResolver=新的UnityHierarchicalDependencyResolver(根容器);
GlobalConfiguration.Configuration.Filters.Add(新的RegisterHttPrequeStationAttribute());
RegisterType(新层次结构CallifeTimeManager(),新注入工厂(容器=>
新的MyDbContext(container.Resolve().Properties[“TenantDB”]作为字符串));

(仅供参考,我引用Unity.AspNet.WebApi numget包来获取UnityHierarchicalDependencyResolver)

使用factort方法注册。这样,您就可以提供显式工厂方法。