【问题标题】:Is it possible to use explicit binding for an interface where a Ninject convention binding already exists?是否可以对已经存在 Ninject 约定绑定的接口使用显式绑定?
【发布时间】:2017-08-04 21:38:27
【问题描述】:

将我的一个接口绑定到一个类时,我收到了 NinjectActivationException

激活 IInitialUploadFolderCleaner 时出错多个匹配项 绑定可用。匹配绑定:1)绑定来自 IInitialUploadFolderCleaner 到 InitialUploadFolderCleaner 2) 绑定 从 IInitialUploadFolderCleaner 到 InitialUploadFolderCleaner 激活路径:1)请求IInitialUploadFolderCleaner 建议: 1)确保您已经定义了一个绑定 InitialUploadFolderCleaner 只有一次。

所以,我使用带有BindDefaultInterface() 方法的约定绑定,但是对于这个类,我想添加一个构造函数参数 - 一个字符串。
为了实现这一点,我想指定显式绑定,希望 ninject 仅在未找到显式绑定时才使用默认绑定。

  kernel.Bind<IInitialUploadFolderCleaner>().To<InitialUploadFolderCleaner>().WithConstructorArgument("siteRootPath", HostingEnvironment.ApplicationPhysicalPath);


        kernel.Bind(x =>
        {
            x.FromAssembliesMatching("MyPrefix.*")
                .SelectAllClasses()
                .BindDefaultInterface();
        });

但是,事实证明,它并不能以这种方式工作,或者它需要一些额外的设置。
我没有在其他任何地方显式绑定此接口,并且当我重命名实现以使其不遵循命名约定时,它可以正常工作并且我得到所有构造函数参数。

【问题讨论】:

    标签: c# asp.net dependency-injection binding ninject


    【解决方案1】:

    您应该能够在基于约定的绑定中排除特定类型,以便您仍然可以为它们编写显式绑定。

       kernel.Bind<IInitialUploadFolderCleaner>().To<InitialUploadFolderCleaner>().WithConstructorArgument("siteRootPath", HostingEnvironment.ApplicationPhysicalPath); 
    
       kernel.Bind(x =>
        {
            x.FromAssembliesMatching("MyPrefix.*")
                .SelectAllClasses()
                .Excluding<InitialUploadFolderCleaner>()
                .BindDefaultInterface();
        });
    

    【讨论】:

      猜你喜欢
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多