Мне часто нужно использовать какой-то класс, который сам должен загрузить некоторую зависимость для работы. Однако мой компонент может иметь более одной конкретной реализации зависимостей, и он будет выбирать один, а не другой, на основе некоторых параметров объекта.Устранение зависимостей по пользовательскому параметру
Настоящая проблема заключается в том, что параметр объекта всегда неизвестен при запуске приложения, поэтому я не могу в этот момент зарегистрировать какую-либо зависимость, а не разрешать их.
Вместо этого, например, когда мне нужно использовать некоторый класс, который сам должен загрузить некоторую зависимость я знаю параметр объекта, используемый concreteBuilder
для того, чтобы вернуть мне соответствующую реализацию:
interface ISample { }
class ParamForBuildSomeISampleImplementation
{
// this instance cannot be create by my startUpApplication - Container - Resolver.
// Instead, all time dependency is required (buttonClick, pageLoad and so on), this class can be instantiated.
}
class Sample1 : ISample
{
// some implementation
}
class Sample2 : ISample
{
// some other implementation
}
class MyISampleFactory
{
// Build ISample
public ISample Build(ParamForBuilderISample obj)
{
// if obj.someProperty == ".." return new Sample1();
// else if obj.someProperty == "--" return new Sample2();
// else if ...
}
}
class NeedsDependency
{
ISample _someSample;
public NeedsDependency(ISample someSample)
{
_someSample = someSample;
}
}
// *** Controllor - ApplicationStartup - other ***
// Here I have not idea how to build ISample dependency
@@ EDIT
// *** button click event handler ***
// Ok, here I know how to create ParamForBuilderISample,
// hence I can call MyISampleFactory, then, I can Use NeedDependency class:
ParamForBuilderISample obj = new ...
obj.SomeProperty = ...
obj.otherSomeProperty = ...
ISample sample = MyISampleFactory.Build(obj);
NeedDependency nd = new NeedDependency(sample);
// perfect, now my buttonClick can execute all what it wants
nd.DoSomething();
nd.DoOtherStuff();
мой сценарий подходит для шаблона инъекции зависимостей? Если это правда, я действительно не знаю, как построить мой шаблон.
Я не понимаю ваш пример. Я знаю, как сделать экземпляр ParamForBuilderSample только в коде. Вы использовали метод Action (что это?), Но метод Action ничего не знает. Наконец, вы сказали: «Включение зависимостей не устраняет необходимость иметь аргументы метода», но я до сих пор не знаю, как это сделать. – bit
Я отредактировал фрагмент кода моего сообщения, чтобы лучше прояснить мою проблему. Пожалуйста, см. @@ Изменить слово. – bit