Я использовал урожай в вещах кода 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 () функция выполняет итерации, хотя, или это выдаст исключение.
Хорошо , хотя вы можете сделать это, как описано в других ответах, я считаю, что в вашем примере есть более важная вещь, а именно то, что вы, вероятно, нарушаете принцип SRP с классом, имеющим много зависимостей.
Что я бы рассмотрел в вашем примере разбивает класс на пару более согласованных классов с конкретными задачами, и, таким образом, количество их зависимостей упадет.
Закон Николы о SRP и DI
«Любой класс, имеющий более трех следует подвергнуть сомнению зависимости Нарушение SRP "
(Чтобы избежать длинного ответа, я подробно опубликовал свои ответы в блоге IoC и SRP )
Строки 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();
}