Asp.net mvc 3 ASP.NET MVC 3中是否可以有多个依赖项解析程序?

Asp.net mvc 3 ASP.NET MVC 3中是否可以有多个依赖项解析程序?,asp.net-mvc-3,dependency-injection,Asp.net Mvc 3,Dependency Injection,ASP.NET MVC 3中是否可能有多个依赖项解析程序(类似于ModelBinder和Provider的情况) ASP.NET中是否可以有多个依赖项解析程序 MVC 3(与ModelBinder和Provider的情况类似) 不,这是不可能的。是只能分配一个冲突解决程序的静态属性。这样说来,在一个应用程序中有多个依赖项解析器几乎没有任何意义。其思想是,所有依赖项都由依赖项注入框架(如Unity、Ninject或StructureMap)管理。然后,您将拥有一个定制的依赖项解析程序来包装您选择的

ASP.NET MVC 3中是否可能有多个依赖项解析程序(类似于ModelBinder和Provider的情况)

ASP.NET中是否可以有多个依赖项解析程序 MVC 3(与ModelBinder和Provider的情况类似)

不,这是不可能的。是只能分配一个冲突解决程序的静态属性。这样说来,在一个应用程序中有多个依赖项解析器几乎没有任何意义。其思想是,所有依赖项都由依赖项注入框架(如Unity、Ninject或StructureMap)管理。然后,您将拥有一个定制的依赖项解析程序来包装您选择的DI框架,ASP.NET MVC将使用该框架在执行管道的各种对象中注入依赖项

在您的问题中,您正在将其与模型绑定器进行比较,但这种比较是不公平的,因为模型绑定器与设计用于绑定的特定类型相关。基本上,您可以为多个视图模型提供许多自定义模型绑定


您在问题中似乎也提到了一些提供商,但不幸的是,您没有说得非常具体,因此对这一点进行评论有点困难。

我可以想到一种情况,即使用多个“容器”或“解析程序”非常有用,这就是多租户。使用多租户,您可以在同一web应用程序中运行多个客户(组织,以及他们自己的用户集),并根据登录、请求信息或域信息动态切换

不过,
dependencysolver.Current
是静态的,正如Darin所指出的那样,所以您对此无能为力(或者不应该)。但是,您可以将多个容器隐藏在单个
idependencysolver
抽象后面,并根据某些条件返回实现。可能是这样的:

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);
    }
}

为什么需要不止一个?我希望有一个全局的,另一个用于控制器工厂,另一个用于元数据提供程序,另一个用于验证程序提供程序。我的猜测是,对于每个任务,使用一个依赖项解析程序可能比使用一个单独的依赖项解析程序来管理项目中的所有依赖项更有效。是的,你是对的,我想与模型绑定器和提供程序进行比较是不公平的。非常感谢,我喜欢你提出的方法。此外,它还可以使每种情况下获得适当的解析器变得非常透明。因此,如果您有10万租户(想想github),您将有10万个依赖项解析器?!我现在正在开发一个多租户应用程序,一个解析器就足够了。不止一个是没有意义的。顺便说一句,GetTenantId方法应该是http模块,而不是静态方法不!租客!=用户。多个renant应用程序通常最多可服务12个租户。只有当您必须以编程方式区分各个Renant时,才会这样做。拥有10万个内核对内存和性能都是极其有害的。
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>();
}