2013-05-21 3 views
3

AppHostBase уже содержит Container свойство (которое решает, чтобы EndpointHost.Config.ServiceManager.Container если они определены), так почему бы не просто использовать Instance.Container (например, для регистрации зависимостей, плагинов и т.д.) внутри Configure или в другом месте внутри любого AppHost реализаций?Почему приложение AppHostBase.Configure ServiceStack принимает параметр Container?

Я отмечаю, что Configure является публичным, так что его можно было бы технически вызывать из любой точки мира, хотя кажется, что AppHostBase.Init() - это единственное место в базе данных ServiceStack, которая делает это.

ответ

1

Вся конфигурация и регистрация должны выполняться в контексте метода AppHost.Configure(Container), после чего он должен оставаться неизменным (только для чтения) для ThreadSafety.

Контейнер передается, потому что здесь должны быть зарегистрированы все зависимости приложения. Поэтому само свойство Контейнера должно рассматриваться как только, поэтому основные классы, такие как IAppHost, предоставляют только метод IResolver.TryResolve.

+0

Правильно, но почему бы не сделать 'Configure() {Instance.Container.Register <...> (...); } 'вместо' Configure (контейнер контейнера) {container.Register <...> (...); } '? Кажется, что они имеют тот же конечный результат, хотя я не проследил его полностью - и это будет более простой дизайн. –

+1

API ведет вас к тому, что делать. Доступ к синглтону не означает, что он должен использоваться только в пределах этой области, он делает вид, что вы можете получить доступ и изменить его в любое время - это не так. – mythz

+0

Это имеет смысл; вы разоблачаете синглтон для чтения в других обстоятельствах, но не хотите, чтобы его «Контейнер» изменился. И я вижу, что 'Configure (Container)' определен в 'IFunqlet', поэтому этот метод является общедоступным и не защищенным (поскольку в противном случае кажется, что' AppHostBase.Init() '- единственное, что нужно назвать) , –