NInject Singletons - они созданы на уровне приложения или сеанса?

2

Я использую NInject в моем приложении ASP.NET MVC, и я не уверен на 100%, как работает singleton при создании моего контекста объектов.

Мой вопрос:

Используя приведенный ниже код, будет один ObjectContext для сеанса пользователя или есть тот, который является долей для все приложение? Я хочу, чтобы каждый пользователь иметь только один контекст за один раз, но каждый пользователь должен иметь свои собственные экземпляр.

Есть ли InRequestScope() что-то, о чем я должен подумать?

Я также делаю то же самое с сервисом WCF, и я предполагаю, что ответ будет таким же для обоих.

My Global.asax:

public class MvcApplication : NinjectHttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Change", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

    protected override void OnApplicationStarted()
    {
        // Ninject Code
        base.OnApplicationStarted();
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);
    }

    protected override IKernel CreateKernel()
    {
        var modules = new INinjectModule[] { new ContextModule() };
        return new StandardKernel(modules);
    }

    public class ContextModule : NinjectModule
    {
        public override void Load()
        {
            Bind<ObjectContext>().To<ChangeRoutingEntities>().InSingletonScope();
            Bind<IObjectContext>().To<ObjectContextAdapter>();
            Bind<IUnitOfWork>().To<UnitOfWork>();
        }
    }
}
Теги:
ninject
asp.net-mvc-2

1 ответ

2
Лучший ответ

ISingletonScope - это широкая область применения. InRequestScope предназначен только для текущего запроса.

Вам нужна область сеанса. См. http://iridescence.no/post/Session-Scoped-Bindings-With-Ninject-2.aspx для способа реализации этого типа области.

public static class NinjectSessionScopingExtention
{
    public static void InSessionScope<T>(this IBindingInSyntax<T> parent)
    {
        parent.InScope(SessionScopeCallback);
    }

    private const string _sessionKey = "Ninject Session Scope Sync Root";
    private static object SessionScopeCallback(IContext context)
    {
        if (HttpContext.Current.Session[_sessionKey] == null)
        {
            HttpContext.Current.Session[_sessionKey] = new object();
        }

        return HttpContext.Current.Session[_sessionKey];
    }
}
  • 0
    Спасибо, Ремо. Мы перешли к запросу области действия для нашего приложения MVC, и оно отлично работает .. Однако наш WCF необходимо изменить ... Я думаю, что это больше связано с конфигурацией WCF, в частности, instanceContextMode ... можете ли вы указать мне в Направление некоторых хороших примеров WCF?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню