我不介意您可以根据请求换出绑定。但是您可以做的是使用条件绑定。
示例 - 默认绑定:
protected override Ninject.IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<IAuthorizationService>()
.To<AuthorizationService>()
.InRequestScope();
kernel.Bind<IService>()
.To<BasicService>();
return kernel;
}
它将为一些基本用户和VIP 用户注入(在IService
需要的地方) 。BasicService
ExtraService
有关条件绑定的各种方式的更多信息,请参阅Ninject-Contextual binding。
编辑
我认为您仍然可以使用条件绑定。您只需将 传播IKernel
到要从新 dll 注册组件的位置。例如,我在我global.asax
的动态加载 dll 模块中有这个 - 它在应用程序启动时运行。
加载模块:
private void LoadAssemblies(IKernel kernel) {
foreach (var fileName in Directory.GetFiles(Server.MapPath("~/App_Data"), "*.dll")) {
Assembly loadedAssembly = Assembly.LoadFile(fileName);
try {
var moduleRegistrations = loadedAssembly.GetTypes()
.Where(t => t.IsClass && t.IsAbstract == false && typeof (IMyModuleRegistration).IsAssignableFrom(t));
foreach (var moduleRegType in moduleRegistrations ) {
IMyModuleRegistration moduleReg = (IMyModuleRegistration) Activator.CreateInstance(moduleRegType);
moduleReg.RegisterComponents(kernel);
}
}
catch (ReflectionTypeLoadException exception) {
....
}
}
}
模块定义:
public class MyExtraModule : IMyModuleRegistration
{
public void RegisterComponents(IKernel kernel)
{
kernel.Bind<IService>()
.To<ExtraService>()
.When(x => x.ParentContext
.Kernel.Get<IAuthorizationService>()
.IsVIPUser());
}
}
ExtraService
仅在MyExtraModule
加载 dll with 时使用。
编辑 2
您可以从某处下载该 dll。加载它,然后测试它是否实现了您的注册接口。然后调用该注册,您就完成了。我看到的唯一问题是:在哪里存储引用IKernel
- 可能一些静态属性HttpApplication
就足够了。您还应该跟踪已加载的 dll。
或者在以后的版本中,Ninject
我可以建议扩展NinjectModule
,然后使用kernel.Load(..)
方法将其加载到内核中。看看这个模块和内核——特别是动态模块加载——也许这就是你要找的。