UnityContainer.Resolve или ServiceLocator.GetInstance? - PullRequest
13 голосов
/ 16 февраля 2012

Это может показаться глупым вопросом, потому что в моем коде все работает, но я зарегистрировал синглтон таким образом с моим контейнером Unity _ambientContainer:

 _ambientContainer.RegisterType<Application.StateContext>(new ContainerControlledLifetimeManager());

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

get {
    return ServiceLocator.Current.GetInstance<Application.StateContext>();
}

внутри моего свойства get, чтобы получить экземпляр моего объекта.Таким образом, я всегда получаю один и тот же экземпляр (Application.StateContext все еще одноэлементный) или GetInstance создает новый?

Лучше вместо этого использовать локальное поле _ambientContainer?

get {
    return _ambientContainer.Resolve<Application.StateContext>();
}

Спасибо.

Ответы [ 3 ]

19 голосов
/ 16 февраля 2012

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

Классы должны указывать свои зависимости в своем общедоступном API, в идеале , указав их в качестве аргументов конструктора , для которых контейнер автоматически предоставит экземпляр всякий раз, когда его попросят разрешить определенный тип (процесс, известный как 1012 * автоматическое связывание *).

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

В заключение, если Dependency Injection не является опцией, я бы избегал, чтобы мои классы ссылались на контейнер напрямую, а вместо этого позволяли бы им обращаться к нему через локатор служб.

9 голосов
/ 16 февраля 2012

Предпочтительно вам следует избегать обоих способов (ab) использования вашего контейнера.

ServiceLocator считается антишаблоном в современной архитектуре приложения.

6 голосов
/ 16 февраля 2012

Я предполагаю, что тип ServiceLocator относится к проекту CommonServiceLocator и что вы используете адаптер Unity, в этом случае GetInstance вызывает container.Resolve, поэтому обе строкиэквивалент.

Вы можете посмотреть источник здесь - http://commonservicelocator.codeplex.com/wikipage?title=Unity%20Adapter&referringTitle=Home

...