NInject Singletons - они созданы на уровне приложения или сеанса? - PullRequest
2 голосов
/ 21 января 2011

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

Мой вопрос:

Используя приведенный ниже код, будет ли один 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>();
        }
    }
}

1 Ответ

2 голосов
/ 24 января 2011

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];
    }
}
...