Как определить контроллер MVC, имеющий зависимость типа значения, с помощью простого инжектора?

У меня есть следующий контроллер:

public class MyController : Controller {
    private readonly IService service;
    private readonly int intDependency;

    public MyController(IService service, int intDependency) {
        this.service = service;
        this.intDependency = intDependency;
    }

    ...
}

Очевидно, что разрешение не работает, и я не могу предоставить параметр конструктора с помощью делегата, так как это приведет к регистрации нескольких конструкторов.

Как правильно поступить в этом случае? Это вообще неправильный ввод значения типа как зависимости? Будет ли лучше обернуть зависимость за интерфейсом?

2 ответа

Решение

Это вообще неправильный ввод значения типа как зависимости?

На самом деле, как вы можете видеть, инжектор не может знать, какие int это должно ввести. На самом деле не имеет смысла.

Будет ли лучше обернуть зависимость за интерфейсом?

Да.

Как правильно поступить в этом случае?

Вы сказали это. Либо интерфейс, либо класс.

Пример:

public class MyConfig
{
    public int MyInt {get; set;}
}

И вы можете настроить SimpleInjector следующим образом:

container.RegisterSingleton(new MyConfig { MyInt = 42 });

и ваш контроллер будет:

public MyController(IService service, MyConfig config) { ...

Примечание. Существует способ внедрить типы примитивов: Зависимости примитивов с помощью простого инжектора. Однако проще и понятнее просто обернуть примитив в класс, как в моем примере.

Будет ли лучше обернуть зависимость за интерфейсом?

Да, это было бы предлагаемое решение. Типы значений не поддерживаются. Сделайте вместо непосредственного введения значения, оберните его в классе и введите это.

Лучше всего ставить интерфейс поверх реализации, но это не обязательно само по себе. Простой Инжектор не имеет значения. Так что это будет работать:

public class Values
{
    public Values(int value)
    { 
        this.SomeValue = value; 
    }

    public int SomeValue { get; }
}

// Register as
container.RegisterSingleton<Values>(() => new Values(1));

Есть варианты, хотя немного некрасиво и ИМО не по пути. Они описаны здесь

Другие вопросы по тегам