0

是否有可能做这样的事情:

var foos = Kernel.where(c=>c.module == myModule).GetAll<foo>;

一个人会怎么做呢?

If(!possible)
在使用 GetAll() 方法时,如何区分绑定到同一个接口?
我知道WithParameter,WithMetadataWithConstructorArgument; WithPropertyValue我应该使用哪一个,为什么?

干杯


更多信息

我需要这个,因为我正在创建一个插件框架。在路由期间,插件框架需要能够确定要查看哪个控制器。如果插件中有多个家庭控制器,它将无法按预期工作。
我需要能够区分哪个插件注册了哪个 IController 实现,以便控制器工厂知道将请求发送到特定插件中的控制器。

4

3 回答 3

0

您是否考虑过使用When(),因此您不必这样做?

IE

Bind<IInterface>().To<YourConcreteTypeOne>().When(r => r.Target.Name == "concreteObjectOne"); 

正如接受的解决方案(更新部分)中所建议的那样。理想情况下,您在设置绑定后不应该真的需要访问内核,否则您会将自己与 DI 框架紧密耦合。如果这不适用,请扩大您的问题以包含更多代码。

于 2012-11-22T00:03:42.253 回答
0

一种简单的方法是定义一个接口,即IControllerProvider具有一个Name和一个GetController方法。您的核心产品加载所有扫描的 IControllerProvider 实现并获取控制器并使用名称和内核中的 Icontroller 实例注册它们。通过这种方法,您的插件可以使用它们自己的容器,或者干脆做可怜的人 DI。然后,您的路由处理程序可以获得一个IEnumerable<IController>. 或者更好地简单地将名称放在IController界面上,这样您就不需要回退到 ninject 元数据。

于 2012-11-22T06:03:20.777 回答
0

我最终将元数据附加到每个:

Bind<IController>().To<MyController>()
   .Named(implementation.GetType().Name.Replace("Controller", string.Empty))
   .WithMetadata("Plugin", PluginName);`

然后像这样路由我的插件:

routes.MapRoute(
                name: "Plugin1",
                url: "Plugin1/{controller}/{action}/{id}",
                defaults: new { Plugin = PluginName, controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

并在控制器工厂的GetControllerType方法中

object requestedModule;
if (requestContext.RouteData.Values.TryGetValue("Plugin", out requestedPlugin))
    controller = kernel.GetAll<IController>(c => c.Name == controllerName && c.Get<string>("module", string.Empty) == (string)requestedPlugin).SingleOrDefault();
于 2012-11-24T01:57:50.060 回答