Какой контейнер DI удовлетворит это

Вот что я хочу от DI-контейнера:

public class Class
{
   public Class(IDependency dependency, string data)  { }
}

var obj = di.Resolve<Class>(() => new Class(null, "test"));

Точки интереса:

  1. Может разрешить как зависимость, так и данные в конструкторе.
  2. Может использовать типобезопасный синтаксис для передачи параметров конструктора (точный синтаксис может отличаться). Да, я могу сделать это сам, получая аргументы конструктора из (Expression.Body as NewExpression) - но мне понадобится способ определить, какие аргументы зарегистрированы в контейнере.

Еще одним важным требованием является то, что я хочу, чтобы мои компоненты выбирались автоматически, т.е. я не хочу регистрировать класс - я хочу, чтобы IoC поднял его, потому что он знает, как разрешить IDependency.

Кроме того, свойство Injection может быть полезно иногда, но это необязательно.

Вопрос действительно в том, что касается комбинации функций - чтобы иметь все из них - типобезопасные, параметры, автоматический подбор... Одну функцию легко проверить, но проверить их комбинацию непросто, если вы не знакомы с ней. конкретный контейнер и знает его особенности. Таким образом, вопрос.

1 ответ

Я думаю, что вам будет лучше, если вы определите абстрактную фабрику, которая может создать ваш класс.

public interface IFactory
{
    MyClass Create(string data);
}

Затем вы можете создать реализацию IFactory следующим образом:

public class MyFactory : IFactory
{
    private IDependency dependency;

    public MyFactory(IDependency dependency)
    {
        if (dependency == null)
        {
            throw new ArgumentNullException("dependency");
        }

        this.dependency = dependency;
    }

    #region IFactory Members

    public MyClass Create(string data)
    {
        return new MyClass(this.dependency, data);
    }

    #endregion
}

В вашем контейнере вы должны зарегистрировать как MyFactory, так и реализацию IDependency.

Теперь вы можете использовать контейнер для разрешения Фабрики и Фабрику для получения класса:

var mc = container.Resolve<IFactory>().Create(data);

Этот подход полностью безопасен по типу и хорошо отделяет зависимости от данных приложения во время выполнения.

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