Инверсия управления для возвращаемого объекта - PullRequest
2 голосов
/ 10 августа 2009

У меня есть метод, возвращающий ISomething. Я пытаюсь использовать Inversion of Control во всей моей программе ... но я понятия не имею, как это сделать, когда дело доходит до возвращаемого значения - я не могу передать его методу или объекту при его создании, потому что этот метод должен создать объект.

Единственное решение, которое я вижу, это передать фабрику ISomething (Func<ISomething>) объекту при его создании. Это обычное / правильное решение или что-то еще рекомендуется?

[Редактировать] Странно - ни у кого больше не было этой проблемы? Я имею в виду, нет никакого (или даже отрицательного) голосования ...

[Редактировать] Подробнее: метод должен импортировать IExcel в ITable. Представляется, что согласие, представленное ниже, заключается в том, что я должен думать об этом методе как о преобразователе, превращающем IExcel в ITable, получая таким образом оба аргумента вместо возврата значения ITable. Я оставлю это еще на один день, а затем пойду с одним из ответов, если ничего нового не появится.

Ответы [ 3 ]

2 голосов
/ 11 августа 2009

Предполагается ли, что ваш метод создает ISomething или устанавливает его состояние и возвращает ISomething с инициализированным состоянием? (или это должна быть одна операция?)

Если в вашем классе есть метод, который отвечает за создание ISomething, то он является ISomethingFactory (если у вас нет смешанных проблем). В этом случае у него есть логика, чтобы выбрать правильную реализацию ISomething и создать ее, поэтому вам не нужно слишком беспокоиться об аспекте IoC.

Однако, если задача этого класса , а не создание соответствующего ISomething, то я, вероятно, передам фабрику. Проблема в том, что в большинстве случаев ваш DI-контейнер должен быть в состоянии сделать это для вас (вызвать фабрику, чтобы получить соответствующее ISomething), поэтому, видя метод, который должен создать ISomething, который не является фабрикой, заставляет меня нервничать.

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

1 голос
/ 12 августа 2009

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

Это звучит почти как учебное описание шаблона Абстрактной фабрики, из которого следует, что ваш объект зависит от соответствующей фабрики.

Что также аккуратно распределяет обязанности: один объект отвечает за создание объекта соответствующего типа, а другой отвечает за выполнение операций с ним перед его возвратом.

0 голосов
/ 11 августа 2009

В конструкторе объекта, который содержит метод, возвращающий ISomething, получите экземпляр контейнера IoC. Затем метод, который создает экземпляр ISomething, может использовать контейнер IoC для получения объекта правильного типа.

т.е:

public class ExcelImporter
{
    private IObjectFactory ObjectFactory { get; set; }

    public ExcelImporter(IObjectFactory objectFactory)
    {
        ObjectFactory = objectFactory;
    }

    public ITable Import()
    {
        var result = ObjectFactory.Get<ITable>();
        { Do import here }
        return result;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...