是否有可能有多个依赖解析器在ASP.NET MVC 3?(Is it possible to hav

2019-08-19 22:40发布

是否有可能在ASP.NET MVC 3以上的依赖解析器(类似于ModelBinders和供应商的情况下)?

Answer 1:

还有就是我能想到在具有多个“容器”或“解析器”的一个场景是有用的,那就是多租户。 随着多租户你运行多个客户(组织,用自己的一组用户)在同一个Web应用程序,以及动态切换基于登录,请求信息或域信息。

不过, DependencyResolver.Current是-as达林noted-静态的,所以有您可以(或者应该怎么处理这件事)没有。 但是,您可以隐藏一个背后多个容器IDependencyResolver抽象和返回基于某些标准的实现。 这可能是这样的:

public class MultiTenantDependencyResolver 
    : IDependencyResolver
{
    Func<int> tenantIdSelector,;
    IDictionary<int, IDependencyResolver> tenantResolvers;

    public MultiTenantDependencyResolver(
        Func<int> tenantIdSelector,
        IDictionary<int, IDependencyResolver> tenantResolvers)
    {
        this.tenantIdSelector = tenantIdSelector;
        this.tenantResolvers= tenantResolvers;
    }

    private IDependencyResolver CurrentResolver
    { 
        get { return this.tenantResolvers[tenantIdSelector()]; }
    }

    public object GetService(Type serviceType)
    {
        return this.CurrentResolver.GetService(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return this.CurrentResolver.GetAllInstances(serviceType);
    }
}

下面的代码片段显示了这个的用法MultiTenantDependencyResolver

var tenantResolvers = new Dictionary<int, IDependencyResolver>
{
    { Tenants.AbcId, BuildResolver(RegisterForTenantAbc) },
    { Tenants.KlmId, BuildResolver(RegisterForTenantKlm) },
    { Tenants.XyzId, BuildResolver(RegisterForTenantXyz) },
};

var multiTenantResolver = new MultiTenantResolver(
    () => GetTenantIdFromUrl(), tenantResolvers);

DependencyResolver.SetResolver(multiTenantResolver);


private static int GetTenantIdFromUrl()
{
    // TODO: return tenant id
}

private static IDependencyResolver BuildResolver(
    Action<IKernel> tenantSpecificRegistrations)
{
    var kernel = new Kernel();

    // TODO: Tenant agnostic registrations. For instance
    kernel.Bind<ITimeProvider>().To<SystemTimeProvider>();

    tenantSpecificRegistrations(kernel);

    return new NinjectDependencyResolver(kernel);
}

private static void RegisterForTenantAbc(IKernel kernel)
{
    // TODO: regisrations for ABC tenant. For instance
    kernel.Bind<ILogger>().To<AbcTenantLogger>();
}


Answer 2:

是否有可能在ASP.NET MVC 3以上的依赖解析器(类似于ModelBinders和供应商的情况下)?

不,这是不可能的。 该DependencyResolver.Current是一个静态属性,它可以被分配唯一一个解析器。 这是说在应用程序中有一个以上的依赖解析器几乎不使任何意义。 我们的想法是,所有的依赖关系是由依赖注入框架,如团结,Ninject或StructureMap管理。 然后,您将有一个自定义依赖解析器包裹你选择的DI框架,将ASP.NET MVC被用来注入在执行流水线的各种对象的依赖性。

您用模型活页夹在你的问题比较,而是因为一个模型绑定关系到其设计结合特定类型的这种比较是不公平的。 基本上,你可以有多个视图模型许多自定义模型粘合剂。

您也似乎在你的问题已经提到了一些供应商可惜所以这是一个有点困难,在这一个发表评论您还没有beeen非常具体。



文章来源: Is it possible to have multiple dependency resolvers in ASP.NET MVC 3?