Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC和web中的Ninject_C#_Asp.net Mvc_Ninject - Fatal编程技术网

C# ASP.NET MVC和web中的Ninject

C# ASP.NET MVC和web中的Ninject,c#,asp.net-mvc,ninject,C#,Asp.net Mvc,Ninject,在ASP.NET MVC应用程序中使用Ninject时,您的网站上的并发用户是否共享内核?有没有可能创建一个条件绑定,这样不同的用户就可以得到相同接口的不同具体实现,就像这样 if (user == "A") kernel.Bind<IFoo>().To<FooForA>(); else kernel.Bind<IFoo>().To<FooForB>(); if(用户==“A”) kernel.Bind().To();

在ASP.NET MVC应用程序中使用Ninject时,您的网站上的并发用户是否共享内核?有没有可能创建一个条件绑定,这样不同的用户就可以得到相同接口的不同具体实现,就像这样

 if (user == "A")
      kernel.Bind<IFoo>().To<FooForA>();
 else
      kernel.Bind<IFoo>().To<FooForB>();
if(用户==“A”)
kernel.Bind().To();
其他的
kernel.Bind().To();
没有冲突

您网站上的并发用户是否共享内核

在典型的(推荐的)设置中,每个AppDomain都有一个
内核的实例。这意味着每个请求(以及每个用户)都访问相同的
内核
实例(可能是并行的)

有没有可能创建一个条件绑定,这样不同的用户就可以得到相同接口的不同具体实现,就像这样

 if (user == "A")
      kernel.Bind<IFoo>().To<FooForA>();
 else
      kernel.Bind<IFoo>().To<FooForB>();
不建议基于运行时数据构建对象图(您的
user==“A”
是基于运行时数据
user
的决策)。这暴露了与以下情况相同的缺点:

它会导致歧义,使组合根复杂化,并承担额外的责任,并且使验证DI配置的正确性变得异常困难

相反,建议是:

让运行时数据通过构造的对象图的方法调用流动

通过为
IFoo
引入一个代理,根据运行时数据将任何传入呼叫转发给
FooForA
foofrob
,您可以简单而优雅地实现这一点。例如:

public sealed class FooSelectorProxy : IFoo
{
    private readonly FooForA afoo;
    private readonly FooForB bfoo;
    public FooSelectorProxy(FooForA afoo, FooForB bfoo) {
        this.afoo = afoo;
        this.bfoo = bfoo;
    }

    public object FooMethod(object args) {
        return CurrentFoo.FooMethod(args);
    }

    private IFoo CurrentFoo {
        get { return user == "A" ? this.afoo : this.bfoo; }
    }
}
使用此
FooSelectorProxy
,您可以进行以下注册:

kernel.Bind<IFoo>().To<FooSelectorProxy>();
kernel.Bind().To();

这将推迟执行
if(user==“A”)
代码,直到构建对象图之后,直到运行时数据可用。

回答得很好。非常感谢你的帮助。