【问题标题】:How to bind Ninject to [Obsolete] constructor?如何将 Ninject 绑定到 [Obsolete] 构造函数?
【发布时间】:2019-10-26 06:26:38
【问题描述】:

在我的子模块中,我有:

public class CustomerRepository : ICustomerRepository
{
    private readonly IDBEngine _dbEngine;
    [CanBeNull] private readonly string _overriddenDebugEmail;

    [Obsolete("Use the other constructor")]
    public CustomerRepository(IDBEngine dbEngine)
    {
        _dbEngine = dbEngine;
        _overriddenDebugEmail = null;
    }
    // ReSharper disable once UnusedMember.Global
    public CustomerRepository(IDBEngine dbEngine, IDebugConstants debugConstants)
    {
        _dbEngine = dbEngine;
        _overriddenDebugEmail = debugConstants.OverridingDebugEmail;
    }
    ...

问题是,当我简单地更新子模块而不实现 IDebugConstants 时,我得到以下运行时错误:

激活 IDebugConstants 时出错

没有匹配的绑定可用,并且类型不是自绑定的。

如果没有实现 IDebugConstants,我希望 Ninject 绑定到 Obsolete 构造函数。但它拒绝因为过时的属性。 理论上,我可以删除 Obsolete 属性,但我希望它表明,一旦使用子模块的所有旧程序都已更新,该代码将不再存在。

有没有办法让 Ninject 忽略 Obsolete 属性?

或者我是否以某种方式完全错了?

【问题讨论】:

    标签: ninject obsolete


    【解决方案1】:

    您可以通过将[Inject] 属性添加到[Obsolete] 构造函数来做到这一点。

    原因是how the constructor scoring is implemented。特别是Score方法的这一部分:

    if (directive.Constructor.HasAttribute(this.settings.InjectAttribute))
    {
        return int.MaxValue;
    }
    
    if (directive.Constructor.HasAttribute(typeof(ObsoleteAttribute)))
    {
        return int.MinValue;
    }
    

    您会看到,如果构造函数具有[Obsolete] 属性,那么它会被赋予最低可能分数。但在此之前,如果构造函数具有[Inject] 属性,那么它将被赋予最高分。

    这在你提到的特定情况下没有帮助,当IDebugConstants 没有实现时你想要一个条件绑定,但它确实回答了“有什么方法可以让 Ninject 忽略 Obsolete 属性吗?”

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 2012-05-29
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多