Asp.net web api 每个请求的热交换绑定

Asp.net web api 每个请求的热交换绑定,asp.net-web-api,ninject,Asp.net Web Api,Ninject,我们有一个ASP.NETWebAPI应用程序,它使用Ninject进行DI。这非常适合使用。我们正在考虑的改进之一是能够根据某种唯一标识符交换每个请求的部分功能 例如。两个客户使用我们的restful api。两者都具有相同的功能。第三个客户为我们的api的超级版本付费。他发出请求,我们加载超级dll并将超级实现绑定到标准接口 本质上,我希望看到的是,我们可以使用Web API和Ninject加载DLL并交换每个请求的绑定 编辑: 因此,两个答案对原问题都是正确的,但我的意图不同,没有正确解释是

我们有一个ASP.NETWebAPI应用程序,它使用Ninject进行DI。这非常适合使用。我们正在考虑的改进之一是能够根据某种唯一标识符交换每个请求的部分功能

例如。两个客户使用我们的restful api。两者都具有相同的功能。第三个客户为我们的api的超级版本付费。他发出请求,我们加载超级dll并将超级实现绑定到标准接口

本质上,我希望看到的是,我们可以使用Web API和Ninject加载DLL并交换每个请求的绑定

编辑:

因此,两个答案对原问题都是正确的,但我的意图不同,没有正确解释是我的错。我们拥有的是每个人都能获得的基本功能层。除此之外,我们还能够在每个客户的基础上实现覆盖此功能的自定义逻辑。此逻辑作为DLL存储在Azure Blob存储中

我们想做的是,当客户发出请求时,获取DLL,绑定所有自定义服务,然后使用这些新绑定服务请求

热插拔不是最好的方法吗?我们对ninject足够新,所以这可能是一个常见的事情,它的实现方式与我们正在考虑的不同

对于某些人来说,我们希望能够为每个客户的定制绑定提供服务

编辑2:

我们对项目使用条件绑定,我们知道我们有备用实现,但在上面的场景中,直到我们获得客户信息并扫描dll,我们才知道是否有备用绑定。我们甚至不知道是否有dll


我们希望这样做,这样我们就可以将文件放入项目中,而不是在项目中引用它。

使用条件绑定:

Bind<IMyService>().To<MyService>();
Bind<IMyService>().To<MyServiceForVIPs>().When(ctx => CurrentPrincipalIsVIP());

使用条件绑定:

Bind<IMyService>().To<MyService>();
Bind<IMyService>().To<MyServiceForVIPs>().When(ctx => CurrentPrincipalIsVIP());

我不介意您可以根据请求交换绑定。但您可以做的是使用条件绑定

示例-默认绑定:

Bind<IMyService>().To<MyService>();
Bind<IMyService>().To<MyServiceForVIPs>().When(ctx => CurrentPrincipalIsVIP());
模块定义:

仅当加载带有MyExtraModule的dll时,才会使用ExtraService

编辑2

你可以从某处下载这个dll。加载它,然后测试它是否实现了注册接口。然后打电话注册,你就完成了。我看到的唯一问题是:在哪里存储对IKernel的引用-可能HttpApplication中的一些静态属性就足够了。您还应该跟踪已加载的DLL


或者在Ninject的更高版本中,我可以建议扩展Ninject模块,然后使用kernel.load将其加载到内核中。。方法看看这个——特别是在部分动态模块加载中——也许这就是您想要的。

我不介意您可以根据请求交换绑定。但您可以做的是使用条件绑定

示例-默认绑定:

Bind<IMyService>().To<MyService>();
Bind<IMyService>().To<MyServiceForVIPs>().When(ctx => CurrentPrincipalIsVIP());
模块定义:

仅当加载带有MyExtraModule的dll时,才会使用ExtraService

编辑2

你可以从某处下载这个dll。加载它,然后测试它是否实现了注册接口。然后打电话注册,你就完成了。我看到的唯一问题是:在哪里存储对IKernel的引用-可能HttpApplication中的一些静态属性就足够了。您还应该跟踪已加载的DLL


或者在Ninject的更高版本中,我可以建议扩展Ninject模块,然后使用kernel.load将其加载到内核中。。方法看看这个-特别是在动态模块加载部分-也许这就是您要寻找的。

我假设您知道核心ninject模块。您可以将所有核心ninject模块加载到内核中。当特殊用户到达时,您可以卸载核心模块并将特定于用户的模块加载到内核中


一个更好的方法是在插件领域有一个特殊的内核。因此,实际上每个插件都有一个内核方法,它加载所需的核心模块,并添加特定于用户的模块(如果有的话)。但这可能会影响性能

我假设您知道核心的ninject模块。您可以将所有核心ninject模块加载到内核中。当特殊用户到达时,您可以卸载核心模块并将特定于用户的模块加载到内核中


一个更好的方法是在插件领域有一个特殊的内核。因此,实际上每个插件都有一个内核方法,它加载所需的核心模块,并添加特定于用户的模块(如果有的话)。但这可能会影响性能

我修改了这个问题,以便更好地解释我自己。你能再看一眼吗?我修改了这个问题以便更好地解释我自己。你能再看一眼吗?我修改了这个问题以便更好地解释我自己。你能再看一眼吗?更新了我的答案。希望能有帮助。我已经给了你们一个投票,因为它更接近我所需要的。我看到的唯一问题是,在得到url之前,我对dll一无所知
在请求中查找并加载它,因此我无法在启动时执行此操作。我需要能够在特定用户的第一个请求时在dll中基本上懒散地加载,并且只考虑该用户使用的服务。我认为常规方法可以帮助解决这个问题。很抱歉,我不知道有任何常规方法可以解决这个问题。但我已经用一些额外的建议更新了我的答案-我修改了这个问题,以便更好地解释我自己。你能再看一眼吗?更新了我的答案。希望能有帮助。我已经给了你们一个投票,因为它更接近我所需要的。我看到的唯一问题是,在请求中找到并加载dll的url之前,我对dll一无所知,因此无法在启动时执行此操作。我需要能够在特定用户的第一个请求时在dll中基本上懒散地加载,并且只考虑该用户使用的服务。我认为常规方法可以帮助解决这个问题。很抱歉,我不知道有任何常规方法可以解决这个问题。但我已经用一些额外的建议更新了我的答案-是的,所有核心模块在启动时都已加载。子内核的想法很有趣,我注意到还有一个子内核扩展集。是的,所有的核心模块都在一开始就被加载了。子内核的想法很有趣,我注意到还有一组子内核扩展。