小编Sta*_*Gay的帖子

根据路线参数注册子集装箱

我们有一个多租户ASP.NET MVC应用程序,该应用程序为多个客户端托管预订引擎。这些客户端中的每个客户端都有多个程序包,这些程序包可能会影响Unity容器的配置。我们将为每个请求创建一个子容器,并根据通过路由传递的客户端和程序包参数注册不同的接口实现。

当前,我们通过执行以下操作来完成此任务:

  1. 控制器具有ServiceLocator属性,该属性使用统一容器来解决依赖关系。
  2. 控制器获取IUnityContainer注入并分配给属性。
  3. 控制器具有自定义的ActionFilterAttribute,可以访问控制器的统一容器,创建子容器,基于客户端和程序包路由参数有条件地注册依赖项实现,然后将此子容器分配给控制器的serviceLocator。
  4. 控制器按需使用serviceLocator来解决各个依赖性。

这是可行的,但确实很笨拙,我最终认为这将是不可持续的。我正在寻找更好的解决方案。

目前,我们一直停留在.NET 4.0上,直到我们打包了一些旧的东西,所以我专门针对Unity 2。

我尝试创建一个自定义IDependencyResolver来创建子容器,并根据将参数存储在Session或HttpContext项目中的路由参数来注册依赖项,但遇到了空HttpContext问题。还有其他方法可以将注册基于路由并将依赖项注入到控制器构造函数中吗?

最终,我还将需要Web API的解决方案。

编辑:示例

public interface IRateService { ... }
public class RemoteRateService : IRateService { ... }
public class LocalRateService : IRateService { ... }

public class CustomDependencyResolver : IDependencyResolver
{
    public object GetService(Type serviceType)
    {
        if(ChildContainer == null)
        {
            ChildContainer = _container.CreateChildContainer();
            var routeData = HttpContext.Current.Request.RequestContext.RouteData.Values;
            if(routeData["client"] == "ClientA")
                ChildContainer.RegisterType<IRateService, RemoteRateService>();
            else
                ChildContainer.RegisterType<IRateService, LocalRateService>();
        }
        return ChildContainer.Resolve(serviceType);
    }
}

public class RateController : Controller
{
    private IRateService …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc dependency-injection unity-container

5
推荐指数
1
解决办法
1184
查看次数