Общая практика IoC - разве службы не зависят друг от друга?

Прямо сейчас у меня есть несколько сервисов, которые определены в сборке, которая не зависит от контейнера IoC (Ninject в моем случае). В основном проекте у меня есть IRepository для доступа к данным, зарегистрированный в контейнере.

this.Bind<IRepository>().To<EntityFrameworkRepository<MyDatabaseEntities>>();

У меня также зарегистрированы сервисы IAuthenticationService и IErrorLogger, конкретная реализация которых я хочу использовать репозиторий для их логики. Однако я не знаю, как лучше всего этого добиться. В настоящее время мой конструктор в обеих конкретных реализациях принимает параметр IRepository, и я передаю его, когда регистрирую их:

this.Bind<IAuthenticationService>().To<MyAuthenticationService>().
                WithConstructorArgument("myRepository", ctx => ctx.Kernel.Get<IRepository());

Здесь я просто приказываю контейнеру захватить экземпляр IRepository и передать его конструктору.

Я не чувствовал себя правильным, заставляя мою сборку служб зависеть от ninject или даже от общего локатора служб (CSL), но я также не уверен в своем нынешнем пути. Ищу мнения и альтернативные решения.

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

7
задан Adam 13 February 2012 в 18:11
поделиться