Используя платформы Внедрения зависимости для классов со многими зависимостями

Я использовал урожай в вещах кода non-linq как это (принимающие функции не живут в том же классе):

public IEnumerable<string> GetData()
{
    foreach(String name in _someInternalDataCollection)
    {
        yield return name;
    }
}

...

public void DoSomething()
{
    foreach(String value in GetData())
    {
        //... Do something with value that doesn't modify _someInternalDataCollection
    }
}

необходимо бояться непреднамеренно изменять набор, которого GetData () функция выполняет итерации, хотя, или это выдаст исключение.

36
задан Mark Heath 11 October 2008 в 20:02
поделиться

2 ответа

Хорошо , хотя вы можете сделать это, как описано в других ответах, я считаю, что в вашем примере есть более важная вещь, а именно то, что вы, вероятно, нарушаете принцип SRP с классом, имеющим много зависимостей.

Что я бы рассмотрел в вашем примере разбивает класс на пару более согласованных классов с конкретными задачами, и, таким образом, количество их зависимостей упадет.

Закон Николы о SRP и DI

«Любой класс, имеющий более трех следует подвергнуть сомнению зависимости Нарушение SRP "

(Чтобы избежать длинного ответа, я подробно опубликовал свои ответы в блоге IoC и SRP )

26
ответ дан 27 November 2019 в 06:11
поделиться

Строки JSON не могут представлять объекты с функциями-членами, поэтому единственное, что вы получите от строки JSON, - это необработанные данные. Предполагая, что результатом метода toJSON является строка JSON, представляющая объект со всеми нефункциональными членами вашего экземпляра класса, вы должны иметь возможность взять полученный объект и прикрепить прототип, чтобы вернуть все функции. Например, с помощью удобной функции jQuery extend :

var o = new someObj("objName");
var json = Object.toJSON(o);
var json_obj = eval(json);
$.extend(json_obj, someObj.prototype);
json_obj.someMethodDefinedOnsomeObj()

В зависимости от того, как фреймворк, который вы используете для представления классов в JavaScript, использует прототипную объектную модель, ваш пробег может очень соответствовать приведенному выше примеру. Кроме того, использование eval () создает брешь в безопасности, поэтому, если вы не доверяете тому, откуда исходит строка JSON, вам следует использовать другой метод десериализации. Просто для полного освещения вот как я сделал это с необработанными прототипами: Теперь у вас может быть служба, заводская служба, которая знает, как решить проблему с услугой записи компакт-дисков по запросу. Это полезно по следующим причинам:

  • Возможно, вы захотите разрешить несколько сервисов одновременно (записать два диска одновременно?)
  • Возможно, вам это не понадобится, и его создание может быть дорогостоящим, поэтому вы разрешать его только , если требуется
  • Вам может потребоваться разрешить, удалить, разрешить, удалить несколько раз вместо того, чтобы надеяться / пытаться очистить существующий экземпляр службы
  • Вы также отмечаете ваш конструктор, который вам нужен и какие из них могут понадобиться

Здесь два одновременно:

using (var service1 = container.Resolve<ISomeService>())
using (var service2 = container.Resolve<ISomeService>())
{
    service1.Instance.DoSomethingHere();
    service2.Instance.DoSomethingHere();
}

Вот два друг за другом, без повторного использования одного и того же сервиса:

using (var service = container.Resolve<ISomeService>())
{
    service.Instance.DoSomethingHere();
}
using (var service = container.Resolve<ISomeService>())
{
    service.Instance.DoSomethingElseHere();
}
4
ответ дан 27 November 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: