如何使用Ninject Conventions Extension进行绑定?

时间:2014-02-27 17:07:06

标签: c# dependency-injection ninject ninject.web.mvc ninject-extensions

我喜欢使用Ninject自动绑定绑定波纹管代码。可以同时使用mannual和amp;单个项目中的自动绑定?让我们采用波纹管手动绑定,我希望通过自动绑定实现。请告诉我如何实现这一目标。

  1. kernel.Bind<TestContext>().ToSelf().InRequestScope();

  2. kernel.Bind<IUnitOfWork<TestContext>>().To<UnitOfWork<TestContext>>();

  3. 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())`

2 个答案:

答案 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();