Какой контейнер DI удовлетворит это
Вот что я хочу от DI-контейнера:
public class Class
{
public Class(IDependency dependency, string data) { }
}
var obj = di.Resolve<Class>(() => new Class(null, "test"));
Точки интереса:
- Может разрешить как зависимость, так и данные в конструкторе.
- Может использовать типобезопасный синтаксис для передачи параметров конструктора (точный синтаксис может отличаться). Да, я могу сделать это сам, получая аргументы конструктора из (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);
Этот подход полностью безопасен по типу и хорошо отделяет зависимости от данных приложения во время выполнения.