Сейчас у меня есть несколько служб, которые определены в сборке, которая не зависит от контейнера 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 как для поддельных, так и для реальных данных). Было бы много логических повторений.