Как связать Ninject с [Устаревшим] конструктором? - PullRequest
1 голос
/ 11 июня 2019

В моем подмодуле у меня есть:

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

Соответствующие привязки недоступны, а тип не является самосвязываемым.

Я хочу привязать Ninject к конструктору устаревших, если IDebugConstants не реализован.Но он отказывается из-за устаревшего атрибута.Теоретически я мог бы удалить атрибут Obsolete, но я хочу показать, что этот код больше не должен существовать после обновления всех старых программ, использующих подмодуль.

Есть ли способ заставить Ninject игнорировать атрибут Obsolete?

Или я как-то совершенно не так?

1 Ответ

0 голосов
/ 12 июня 2019

Это можно сделать, добавив атрибут [Inject] в конструктор [Obsolete].

Причина этого в том, как реализована оценка конструктора . В частности, этот раздел метода Score:

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

if (directive.Constructor.HasAttribute(typeof(ObsoleteAttribute)))
{
    return int.MinValue;
}

Вы увидите, что если конструктор имеет атрибут [Obsolete], ему дается минимально возможная оценка. Но до этого, если конструктор имеет атрибут [Inject], ему будет присвоен максимально возможный балл.

Это не помогает в указанном вами конкретном случае, когда требуется условное связывание, когда IDebugConstants не реализовано, но оно отвечает «Есть ли способ заставить Ninject игнорировать атрибут« Устаревший »?»

...