0

私の WCF プロジェクトでは、global.asax で Castle Windsor を使用してインターフェイスを登録します。

            Component.For<IStrategy>()
                .ImplementedBy<MyStrategy>()
                .LifestylePerWcfOperation(),

その後、同じファイルで、プロバイダーを使用して FluentNhibernate を使用して NHibernate を構成します。

FluentConfiguration configuration = Fluently.Configure()
            .Database(
                MsSqlConfiguration.MsSql2008.ConnectionString(myConnString)
                .Provider<ConnectionProvider>())
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<TenantMap>()) etc etc

ただし、この ConnectionProvider は、それを使用する必要がある他の WCF サービスがあるため、共通の共有 dll ライブラリでホストされます。この依存関係を以下のように登録したいのですが、機能しません。つまり、インスタンスを手動で新しく作成する必要があります。

    public ConnectionProvider()
    {    
        // doesnt work
        using (IDependencyScope scope = GlobalConfiguration.Configuration.DependencyResolver.BeginScope())
        {
            _myStrategy = scope.GetService<IStrategy>();
        }
    }

とにかくこれを機能させる方法はありますか?現在、別のアセンブリにあるように、失われたスコープのようです。同じアセンブリで、DependencyScope は正常に動作し、インスタンスを作成しますが、それを共有 dll に保持したいと考えています。

編集:私が得るエラーは、このビットのコードの時計で「System.Web.Http.Dependencies.EmptyResolver」です:GlobalConfiguration.Configuration.DependencyResolver

4

1 に答える 1

0

上記のコードにはいくつかの問題があります。

1) WcfOperation ごとのライフスタイルで IStrategy、MyStrategy を登録しています。これは、windsor が各 WcfOperation の戦略を作成することを意味します。一方、scope.GetService を使用してコンポーネントのライフスタイルを手動で設定しようとしています。scope.GetService を機能させるには、ライフスタイル スコープが必要です。

2) 上記の ConnectionProvider のコードがコンストラクターであると仮定すると、コンストラクターはコンテナーから何かを取得しようとしているようです。これは一般的に悪い考えであり、windsor のような Ioc コンテナーを使用する場合はさらに悪いことです。代わりに、IStrategy をコンストラクターに渡します (注入します)。

3) ここでコンテナーをコンストラクターと呼んでいるのを見ると、おそらく、コンテナーへの呼び出しは 3 つだけであるという原則を順守していないことを意味します。コンテナを解放します。

このコンテナーの操作方法を完全に理解するために、依存性注入と Ioc コンテナー全般についてもう少し読むことをお勧めします。

于 2015-02-27T10:18:25.040 に答える