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

Это то, что я хочу от контейнера DI:

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

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

Достопримечательности:

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

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

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

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

Ответ 1

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

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.

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

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

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