【发布时间】:2014-03-04 07:59:55
【问题描述】:
我想用 Ninject.Extensions.Conventions 解决两个场景。
第一个是一个简单的例子:每当请求来自名称空间的包含“服务”一词的实例时,返回唯一匹配类的单例实例。我试过这样:
Kernel.Bind(service => service.FromThisAssembly()
.Select(theClass => theClass.Namespace.Contains("Service"))
.BindDefaultInterface()
.Configure(binding => binding.InSingletonScope()));
其中一些服务得到了解析,但是当解析链到达Impl1 具有IService2 依赖项的点时,我遇到了ActivationException。
这个绑定有什么问题?
第二个可能同样简单。所有继承BaseClass 的类都应该通过一个方法来实例化。这是我到目前为止使用的解析代码,按类执行此操作:
Bind<MyViewModel>().ToMethod(ctx => fac.CreateProxy<MyViewModel>())
.InSingletonScope();
[ 注意:在本例中,fac 是构建 Castle 代理的自定义工厂。]
对于从ViewModelBase 和Extensions.Conventions 继承的类,我该如何做这样的事情?
我已经找到了选择部分,就在这里。
Kernel.Bind(ViewModel => ViewModel.FromThisAssembly()
.Select(t => t.BaseType == typeof(ViewModelBase))
);
现在我需要让那个工厂投入使用......
一般问题:
-
Extensions.Conventions 的绑定方式似乎与常规方式完全相反:
忍者:
Bind <Interface>() . To <Implementation> ()-
约定:
SelectAllClasses().BindDefaultInterface()为什么会这样,还是我误解了这个?
我曾经将我的绑定放在派生自 NinjectModule 的类中,而且我最好继续这样做。使用
Extensions.Conventions时有什么不这样做的原因吗?
【问题讨论】:
-
关于您的第一个示例,您能否发布示例您如何尝试从服务命名空间解析类型?
-
那里有样例,第一个代码sn -p
-
不,那是注册部分,我对您如何使用/解析注册类型感兴趣,所以您会得到一个
ActivationException -
啊,好的。我会将那部分添加到帖子中
-
我更新了帖子,问题和我想的有点不一样……
标签: dependency-injection ninject conventions ninject-extensions