我喜欢使用Ninject自动绑定绑定波纹管代码。可以同时使用mannual和amp;单个项目中的自动绑定?让我们采用波纹管手动绑定,我希望通过自动绑定实现。请告诉我如何实现这一目标。
kernel.Bind<TestContext>().ToSelf().InRequestScope();
kernel.Bind<IUnitOfWork<TestContext>>().To<UnitOfWork<TestContext>>();
Bellow从基础接口继承的所有接口: IRepository&lt;型号&gt;
3。 kernel.Bind<IUserRepository>().To<UserRepository>();
4。 kernel.Bind<IAccountRepository>().To<AccountRepository>();
5。 kernel.Bind<IMessageRepository>().To<MessageRepository>().WithConstructorArgument("apikey", AppSettingsManager.GetSmsApiKey)
我是否需要为多个班级编写.Exclude<MessageRepository>()
如果我需要这样做,例如
.Exclude<ARepository>()
.Exclude<BRepository>()
.Exclude<CRepository>()
?
和1&amp; 2是否需要单独手动绑定?或{1}可以使用BindToSelf()' and
完成。配置(b =&gt; b.InRequestScope())`?
答案 0 :(得分:5)
是的,可以在同一个项目中使用约定绑定和单个绑定,即使在同一个模块中也是如此。
IBindingRoot.Bind(x => x
.FromThisAssembly()
.IncludingNonePublicTypes()
.SelectAllClasses()
.InheritedFrom(typeof(IRepository<>))
.BindDefaultInterface()
.Configure(y => y.InRequestScope()));
但是,您将无法将构造函数参数传递给特定的类。所以我建议用一个包装访问配置的接口替换构造函数参数(无论如何这都是一个不错的设计)。
或者您也可以这样做:
IBindingRoot.Bind(x => x
.FromThisAssembly()
.IncludingNonePublicTypes()
.SelectAllClasses()
.InheritedFrom(typeof(IRepository<>))
.Exclude<MessageRepository>()
.BindDefaultInterface()
.Configure(y => y.InRequestScope()));
IBindingRoot.Bind<IMessageRepository>().To<MessageRepository>)
.WithConstructorArgument("apikey", AppSettingsManager.GetSmsApiKey)
.InRequestScope();
- &GT;您可以为每个存储库执行一个.Exclude<TRepository>()
,其中约定绑定是不够的。对于每个exlucded绑定,您必须自己指定一个。如上所述:实现IRepository<>
的所有类的条件绑定,除了类MessageRepository
,它有自己的绑定。
另外看看这个: https://github.com/ninject/ninject.extensions.conventions/wiki/Projecting-Services-to-Bind
附录:请注意,您可以指定多个常规绑定,例如:
IBindingRoot.Bind(x => x
.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom(typeof(IFoo))
.BindDefaultInterface()
.Configure(y => y.InRequestScope()));
IBindingRoot.Bind(x => x
.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom(typeof(IBar))
.BindToSelf()
.Configure(y => y.InRequestScope()));
完全没问题。
答案 1 :(得分:2)
如果只有少数例外情况,则上一个解决方案有效。如果它们中有更多,你将会得到许多没有意义的约定。
使用IBindingRoot.Rebind方法覆盖与约定已涵盖的绑定重叠的绑定。
IBindingRoot.Bind(x => x
.FromThisAssembly()
.SelectAllClasses()
.BindAllInterface());
IBindingRoot.Rebind<IMessageRepository>().To<MessageRepository>)
.WithConstructorArgument("apikey", AppSettingsManager.GetSmsApiKey)
.InRequestScope();