Как привязать Ninject к [устаревшему] конструктору?

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

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 привязывалась к конструктору Obsolete, если IDebugConstants не реализован. Но отказывается из-за устаревшего атрибута. Теоретически я мог бы удалить атрибут Obsolete, но я хочу, чтобы он показал, что этот код больше не должен существовать после обновления всех старых программ, использующих подмодуль.

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

Или я как-то ошибаюсь?


person Sarov    schedule 11.06.2019    source источник


Ответы (1)


Вы можете сделать это, добавив атрибут [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 игнорировать атрибут Obsolete?»

person Owen Pauling    schedule 12.06.2019