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

アンビエント スコープ コンテキストを使用しているため、シングルトンのように DbContext を消費/注入できFunc<DbContext>ます。その後、Func が呼び出されるたびに、現在のアンビエント スコープ / リクエストにバインドされた値が返されます。

于 2016-10-21T20:12:32.937 に答える