1

我正在尝试创建完全单例应用程序(Web 和控制台)。但是实体 DbContext 应该在 web 上使用 PerWebRequest。

我应该如何在容器上注册它以支持这一点?我知道一旦类被初始化为单例,我将在内存上的单个实例上运行,所有注入的类也作为单例。

以下代码是我对所有 Web 应用程序和控制台应用程序的容器初始化。- 在控制台中运行时我应该如何注册?- 当在 Web 上运行并且 Owin 调用启动事物时,有时我需要解析要在身份验证中使用的对象,但 Owin 在“无上下文”环境中运行。如何检测和使用它?

    private static IContainer Initialize(IContainer container)
    {
        if (container == null)
            container = new Container(
                rules => rules
                    .WithDefaultReuseInsteadOfTransient(Reuse.InWebRequest)
                    .WithFactorySelector(Rules.SelectLastRegisteredFactory())
                    .With(FactoryMethod.ConstructorWithResolvableArguments)
                    .WithoutThrowOnRegisteringDisposableTransient(),
                scopeContext: new AsyncExecutionFlowScopeContext()
            );

        string prefix = GetPrefix();

        var implementingClasses =
            AppDomain.CurrentDomain.GetAssemblies().ToList()
                .Where(x => x.FullName.StartsWith(prefix))
                .SelectMany(x => x.GetTypes())
                .Where(type =>
                    (type.Namespace != null && type.Namespace.StartsWith(prefix)) &&
                    type.IsPublic &&                    // get public types 
                    !type.IsAbstract &&                 // which are not interfaces nor abstract
                    type.GetInterfaces().Length != 0);  // which implementing some interface(s)

        Parallel.ForEach(implementingClasses, implementingClass =>
        {
            container.RegisterMany(new[] { implementingClass }, Reuse.Singleton, serviceTypeCondition: type => type.IsInterface);
        });

        return container;
    }
4

1 回答 1

0

当您使用环境范围上下文时,您可以像Func<DbContext>在单例中一样使用/注入 DbContext。然后每当调用 Func 时,它都会返回绑定到当前环境范围/请求的值。

于 2016-10-21T20:12:32.937 回答