У меня есть веб-приложение с сервером ASP. NET MVC, EF6, Ninject и SQL. Но я думаю, что есть проблема архитектуры. Мне нужно, чтобы я использовал сервисный локатор в BLL. Я определяю поле stati c для ядра ninject. Когда я после регистрации услуг, я устанавливаю его в поле stati c и использую его в BLL. Но на sql сервере много тупиков. Каково ваше предложение? Я бы использовал правильный путь.
//Const.cs
public static class Const
{
public static IKernel NinjectKernel;
}
//Ninject.Web.Common
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
try
{
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
//I set in here for service locator and i use it in BLL
Const.NinjectKernel = kernel;
return kernel;
}
catch
{
kernel.Dispose();
throw;
}
}
//MyService.cs (BLL)
public void MySampleMethod(){
var ninjectKernel = Const.NinjectKernel;
var myService = ninjectKernel.Get<IMyService>();
//In here of course there is alot of dead lock in sql server.
myService.someMethod();
.
.
}
//Ninject.Web.Common
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUnitOfWork>()
.To<UnitOfWork>()
.InRequestScope();
kernel.Bind<DbContext>()
.ToMethod(ctx => kernel.Get<IUnitOfWork>().GetContext())
.InRequestScope();
kernel.Bind<IMyService>().To<MyServiceManager>().InRequestScope();
}