如何将Ninject绑定到[过时]构造函数?

时间:2019-06-11 19:10:45

标签: ninject obsolete

在我的子模块中,我有:

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属性,但我希望它表明一旦使用该子模块的所有旧程序都已更新,该代码将不再存在。

有什么方法可以使Ninject忽略过时的属性吗?

还是我会以某种方式完全犯错?

1 个答案:

答案 0 :(得分:0)

您可以通过将[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属性? “