В моем проекте у меня была зависимость контроллера от IRepositoryProvider среди других.Как разрешить впрыск конструктора с несколькими слоями
public class HomeController : BaseController
{
public HomeController(ISessionWrapper sessionWrapper,
IRepositoryProvider repositoryProvider,
IApplicationConfiguration applicationConfiguration)
: base(sessionWrapper, repositoryProvider, applicationConfiguration)
{}
...
}
IRepositoryProvider и его реализация жить в BLL слое. Другое дело отметить, что IRepositoryProvider также имеет некоторые параметры. Они используются, чтобы определить, какие строки подключения использовать (Environment * 5 возможных подключений).
public RepositoryProvider(string environment, IApplicationConfiguration applicationConfiguration)
{
_applicationConfiguration = applicationConfiguration;
_environment = environment;
}
Все это прекрасно работает с двумя слоями и этой конфигурацией Ninject.
kernel.Bind<IRepositoryProvider>()
.To<RepositoryProvider>()
.InRequestScope()
.WithConstructorArgument("environment",
context => context.Kernel.Get<ISessionWrapper>().CurrentEnvironment)
.WithConstructorArgument("applicationConfiguration",
context => context.Kernel.Get<IApplicationConfiguration>());
Моя проблема возникает, когда я представляю сервисный уровень. Вместо того, чтобы полагаться на IRepositoryProvider в моих контроллерах для доступа к данным, я хочу использовать сервисный уровень. В идеале тогда я не хочу ссылаться на слой BLL и только на сервисный уровень.
public class HomeService : IHomeService
{
public IRepositoryProvider RepositoryProvider { get; private set; }
public HomeService(IRepositoryProvider repositoryProvider)
{
RepositoryProvider = repositoryProvider;
}
...
}
Итак, мой вопрос заключается в следующем: возможно ли, чтобы я не ссылался на уровень сервиса и BLL из проекта MVC? Или это весь набор массивного запаха кода?
Спасибо.
ОБНОВЛЕНИЕ: Я полагаю, что должен был сказать свои идеальные ссылки. Интернет -> Сервис -> BLL. В настоящий момент Web ссылается на Service и BLL, чтобы Ninject разрешил все.
ОБНОВЛЕНИЕ 2: Это похоже на возможное решение? How to tell Ninject to bind to an implementation it doesn't have a reference to
Вы все равно будете использовать IRepositoryProvider, определенный в BLL, не так ли? Поэтому, я думаю, вам все равно придется ссылаться на него. Но я не вижу, что Ninject имеет к этому отношение. – treze
Я сделал обновление. – merekel