Реализация сервисного локатора Ninject в ASP. NET n-уровневом приложении - PullRequest
0 голосов
/ 23 января 2020

У меня есть веб-приложение с сервером 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();
}
...