Когда фактически запускается Unity InjectionConstructor? - PullRequest
1 голос
/ 11 августа 2011

У меня есть следующий код:

IOC.Container.RegisterType<IRepository, GenericRepository>
              ("Customers", new InjectionConstructor(new CustomerEntities()));

Меня интересует, будет ли new CustomerEntities() вызываться один раз, когда происходит регистрация типа ИЛИ, если каждый раз IRepository (с именем «Customers»)решен новый CustomerEntities будет сделан.

Если это не последний, то есть ли способ заставить его работать больше как делегат?(То есть он будет делать новый каждый раз, когда решает?)

Я нашел этот код:

IOC.Container.RegisterType<IRepository, GenericRepository>("Customers")
             .Configure<InjectedMembers>()
             .ConfigureInjectionFor<ObjectContext>
              (new InjectionConstructor(new CustomerEntities()));

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

Любой совет будет отличным!

1 Ответ

5 голосов
/ 12 августа 2011

Код, который у вас там выполняется, запускается один раз - во время регистрации создается один объект CustomerEntities, и этот экземпляр используется в качестве параметра для всех объектов GenericRepository, разрешенных позже.

Если вам нужен отдельный экземпляр CustomerEntitiesдля каждого экземпляра GenericRepository это довольно просто - достаточно просто поднять контейнер.При регистрации сделайте следующее:

IOC.Container.RegisterType<IRepository, GenericRepository>("Customers", 
    new InjectionConstructor(typeof(CustomerEntities)));

Это сообщит контейнеру "При разрешении IRepository создайте экземпляр GenericRepository. Вызовите конструктор, который принимает один параметр CustomerEntities. Разрешите этот параметр через контейнер.

Это должно сработать. Если вам нужно выполнить специальную настройку в контейнере для разрешения CustomerEntities, просто сделайте это с помощью отдельного вызова RegisterType.

Второй пример, который вы показали, это устаревший API изUnity 1.0. Не используйте его, он не делает ничего больше, чем вы можете сделать с RegisterType сейчас.

...