Проект ASP.Net MVC 3 с Ninject и HierarchicalLifetimeManager? - PullRequest
1 голос
/ 13 января 2012

Прежде всего, внедрение зависимостей является относительно новым для меня. Я выполнил первый проект с использованием Unity.MVC3, и теперь я хотел бы перейти на Ninject для нового проекта, так как он, кажется, самый популярный инжектор зависимостей для .Net проектов. Поэтому сейчас я пытаюсь использовать Ninject v2.2.1.4 с Ninject.MVC3 v2.2.2.0 в моем проекте.

В моем предыдущем проекте, где я использовал Unity, в моем классе Bootstrapper было что-то вроде следующего кода:

private static IUnityContainer BuildUnityContainer()
{
    var container = new UnityContainer();

    container.RegisterType<ITestService, TestService>();            
    container.RegisterType<IDatabaseFactory, DatabaseFactory>(new HierarchicalLifetimeManager());
    container.RegisterType<IUnitOfWork, UnitOfWork>();
    container.RegisterType<ILoggingService, LoggingService>();

    container.RegisterControllers();

    return container;
}

Теперь, мой новый проект, я заменил его на что-то вроде следующего кода в классе NinjectMVC3 (App_Start):

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<ITestService>().To<TestService>();
    //This does not compile:
    //kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>(new HierarchicalLifetimeManager());
    kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>();
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>();
    kernel.Bind<ILoggingService>().To<LoggingService>();
} 

Однако я не знаю, что мне делать с привязкой DatabaseFactory, поскольку обычно она требует использования HierarchicalLifetimeManager. Может кто-нибудь сказать мне, как правильно создать привязку для DatabaseFactory?

1 Ответ

0 голосов
/ 13 января 2012

Прежде всего, добавьте эти ссылки в NuGet, чтобы убедиться, что у вас есть совместимый набор пакетов.

Затем, если вы добавите Ninject.Web.MVC, он установит код инициализации проекта для вас.через сценарий Power Shell.

И, наконец, создайте такой класс BindModule и добавьте его в модуль в методе CreateKernel, который был создан на втором этапе.

public class BindModule : NinjectModule
{
    public override void Load()
    {
        this.Bind<IControllerActivator>().To<CustomControllerActivator>().InRequestScope();
        this.Bind<MembaseClient>().ToMethod(context => new MembaseClient()).InSingletonScope();
        this.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
        this.Bind<ISessionFactory>().ToMethod(o => MyAutoMapper.sessionFactory).InSingletonScope();
        this.Bind<ISession>().ToMethod(o => MyAutoMapper.sessionFactory.OpenSession()).InRequestScope();
        }
  }

Часть класса NinjectMVC3

public static class NinjectMVC3
{
    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var modules = new NinjectModule[] { new BindModule() };
        var kernel = new StandardKernel(modules);

        RegisterServices(kernel);

        return kernel;
    }
}

Как вы можете видеть выше, в Ninjet встроены функции, позволяющие заботиться о различных жизненных циклах для каждого объекта.

...