2013-03-13 3 views
0

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

Настоящая проблема заключается в том, что параметр объекта всегда неизвестен при запуске приложения, поэтому я не могу в этот момент зарегистрировать какую-либо зависимость, а не разрешать их.

Вместо этого, например, когда мне нужно использовать некоторый класс, который сам должен загрузить некоторую зависимость я знаю параметр объекта, используемый 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(); 

мой сценарий подходит для шаблона инъекции зависимостей? Если это правда, я действительно не знаю, как построить мой шаблон.

ответ

0

Вместо использования инъекции конструктора для передачи в этой «зависимости от времени выполнения» вам может быть лучше использовать метод инъекции. Это может даже полностью устранить потребность для завода:

private readonly ISample sample; 

public MyController(ISample sample) { 
    this.sample = sample; 
} 

public string button_click_event_handler(object s, EventArgs e) { 
    ParamForBuilderISample obj = new ... 
    obj.SomeProperty = ... 
    obj.otherSomeProperty = ... 

    this.sample.DoSomething(obj); 
} 

Вы все еще нужно переключиться куда-нибудь, но вместо того, чтобы иметь фабрику, вы могли бы реализовать прокси-сервер для ISample:

public class SampleProxy : ISample 
{ 
    private readonly Sample1 sample1; 
    private readonly Sample2 sample2; 

    public SampleProxy(Sample1 sample1, Sample2 sample2) { 
     this.sample1 = sample1; 
     this.sample2 = sample2; 
    } 

    public void DoSomething(ParamForBuilderISample param) { 
     this.GetSampleFor(param).DoSomething(param); 
    } 

    private ISample GetSampleFor(ParamForBuilderISample param) { 
     // if obj.someProperty == ".." return this.sample1; 
     // else if obj.someProperty == "--" return this.sample2; 
     // else if ... 
    } 
} 

Ваш ParamForBuilderISample выглядит как parameter object. Инъекция зависимостей не устраняет необходимость иметь аргументы метода. Данные все равно должны передаваться с помощью методов.

+0

Я не понимаю ваш пример. Я знаю, как сделать экземпляр ParamForBuilderSample только в коде. Вы использовали метод Action (что это?), Но метод Action ничего не знает. Наконец, вы сказали: «Включение зависимостей не устраняет необходимость иметь аргументы метода», но я до сих пор не знаю, как это сделать. – bit

+0

Я отредактировал фрагмент кода моего сообщения, чтобы лучше прояснить мою проблему. Пожалуйста, см. @@ Изменить слово. – bit

Смежные вопросы