Должно ли создание Unity Container считаться дорогой операцией, связанной с ресурсами и временем? - PullRequest
1 голос
/ 15 сентября 2011

Я недавно начал использовать Unity для внедрения зависимостей в .net. У меня сложилось впечатление, что Unity Container, скорее всего, будет одноэлементным или статическим членом класса. Я видел другого разработчика, использующего его в обработчике запросов, который будет получать много трафика.

Происходит ли какое-то волшебство, благодаря которому затраты на создание нового контейнера Unity каждый раз остаются на низком уровне, или этот код должен быть переработан, чтобы создать контейнер Unity только один раз?

Этот код является частью класса реализации службы .svc.

public string DoSomeWork(Request request)
{
   var container = new UnityContainer().LoadConfiguration("MyContainer");
   var handler = container.Resolve<RequestHandler>();
   return handler.Handle(request);
}

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Не уверен на 100% с Unity, но с большинством контейнеров IoC создание контейнера и особенно загрузка конфигурации контейнера - это достаточно дорогая операция.

У меня есть вопрос, почему этот разработчик используетКонтейнер таким образом, однако.В идеале контейнер IoC даже не должен быть статическим или одноэлементным объектом - его следует создавать только для разрешения объекта верхнего уровня дерева зависимостей, а остальные объекты в вашем приложении должны создаваться автоматически посредством внедрения зависимостей.В случае вашего примера, класс, содержащий этот метод, в идеале должен иметь RequestHandler (в идеале интерфейс этого), внедренный в него через конструктор, так что классу не нужно знать о контейнере IoC.

0 голосов
/ 15 сентября 2011

Это неправильный способ использования контейнера IOC - в основном вы используете его как указатель службы , но это приведет к разбросу зависимостей от контейнера IOC по всей базе кода.

Что вам нужно сделать, так это иметь одно центральное место в вашей кодовой базе, где разрешаются все зависимости, а затем использовать внедрение зависимостей (DI) для распространения разрешенных конкретных классов по цепочке, т.е.Так что ваш класс действительно должен выглядеть примерно так:

public class Foo
{
    private readonly IRequestHandler _handler;

    public Foo(IRequestHandler handler)
    {
        _handler = handler;
    }

    public string DoSomeWork(Request request)
    {
        return _handler.Handle(request);
    }
}
...