在我的子模块中,我有:
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忽略过时的属性吗?
还是我会以某种方式完全犯错?
答案 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属性? “