4

こんにちは、私はウィンザー城に不慣れで、いくつかの基本を理解するのに苦労しているので、問題をより早く解決することを期待してコードを調べるのではなく、質問を投稿することにしました.

構成ファイル web.config から情報を取得する必要がある Web サービスがあります。この情報はカスタム構成セクションにあり、その情報を必要とするクラスにどのように取得できるのか疑問に思っています。IISまたはカスタムWindowsサービスを介してこれをホストする可能性があるため、そのクラスを構成ファイルに結び付けたくありません。私の最初の試みは、次のようなことをすることでした:

iocCon.Register(Component.For<ErrorMessagesSection>().LifeStyle.Singleton.Instance(FindConfigSection<ErrorMessagesSection>())); 

private T FindConfigSection<T>() where T : ConfigurationSection
    {
        System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/web.config");//TODO: remove this hard coding to iis hosting  .OpenExeConfiguration(ConfigurationUserLevel.None);
        ConfigurationSectionGroupCollection sectionGroups = config.SectionGroups;

        foreach (ConfigurationSectionGroup sectionGroup in sectionGroups)
            foreach (ConfigurationSection configurationSection in sectionGroup.Sections)
                if (configurationSection.GetType() == typeof(T))
                    return (T) configurationSection;
        return null;
    }

セクションは一度しか定義できないため、これは基本的にセクションを取得して、エラー メッセージ ファクトリ クラスのコンストラクターに挿入できるようにします。これはエラーをスローしませんが、セクションが2回作成され、他の問題を引き起こしていることに気付きました(これは修正する必要がありますが...) とにかくこれを回避するために、単一のインスタンスを作成して自分で登録することにしましただから私は試しました:

UGLY_HACK = new ConfigFileErrorMessageManager(eMessages);
iocContationer.Register(Component.For<IErrorMessageManager>().ImplementedBy<ConfigFileErrorMessageManager>().LifeStyle.Singleton.Instance(UGLY_HACK));

これは、作成したばかりのコンテナーの最初の登録であり、次のように爆発します。

[ComponentRegistrationException: This component has already been assigned implementation xxx.ConfigFileErrorMessageManager]
Castle.MicroKernel.Registration.ComponentRegistration`1.ImplementedBy(Type type,     IGenericImplementationMatchingStrategy genericImplementationMatchingStrategy) +310

Castle.MicroKernel.Registration.ComponentRegistration`1.Instance(TService instance) +44

私の最初の質問: どのようにこのエラーが発生する可能性がありますか (他に何も登録されていません) / または、見た目よりも微妙な何かを意味しますか? 2 番目の質問: 必要なクラスに構成情報を取得するためのベスト プラクティスは何ですか (これは間違っているのでしょうか)。

ご協力いただきありがとうございます

4

1 に答える 1

5

本当に必要なのは、アプリケーションの構成を Windsor に登録できるアダプターだけのようです。ConfigurationManager

IConfigurationManagerこれは、まさにそれを可能にするためのアダプターを使用し実装WebConfigurationManagerです。

登録するには

container.Register(
    Component.For<IConfigurationManager>()
             .Instance(new WebConfigurationManagerAdapter()));

IConfigurationManagerこれで、構成にアクセスする必要があるコンポーネントに注入できます。

特定のセクションのみを挿入したい場合は、ファクトリ メソッドを Windsor にIConfigurationManager登録して、コンテナに登録されたものから強く型付けされたセクションを取得できます。

container.Register(
    Component.For<ErrorMessagesSection>()
             .UsingFactoryMethod(kernel => 
                 kernel.Resolve<IConfigurationManager>()
                       .GetSection<ErrorMessagesSection>("errorSectionName")));
于 2012-05-02T17:31:28.293 に答える