Какой контейнер 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);
Этот подход полностью безопасен для типов и прекрасно отделяет зависимости от данных приложения времени выполнения.