1

Web ベースの CMS プラットフォーム用の再利用可能なコンポーネントをいくつか開発中ですが、Spring.NET の代わりに Unity を使用して調査したいと考えていました。

解決策 1 では、階層型アーキテクチャでさまざまなコンポーネントを開発しました。Spring.NET を使用して、アセンブリの 1 つに XML 構成ファイルを埋め込むことができます。これは、どのオブジェクトが DI コンテナーに読み込まれるかを宣言します。コンポーネントのビルダーは、コンポーネントのコンテキスト内でどの実装が優先されるかを決定する必要があるということです。

私の他のソリューションでは、参照を追加してアセンブリから構成を読み込むだけで、それらの要素がその Web サイトの実行中のコンテナーに読み込まれます。

Unity でのこのようなシナリオの構成戦略はどのようなものになるでしょうか?

4

1 に答える 1

1

Unityは、XML構成(別名デザインタイム構成)とプログラム構成(別名ランタイム構成)の両方をサポートします。XML構成は、Unity構成スキーマに従う必要があります。

箱から出して、XML構成は.NET構成にフックするため、app.config / web.configを使用して手動でロードしたくない場合は、構成情報をロードするために独自のConfigurationSectionクラスを作成する必要があると思います。

public class MyUnityConfigurationSection : UnityConfigurationSection
{
    public string Serialize()
    {
        return SerializeSection(null, UnityConfigurationSection.SectionName, 
            ConfigurationSaveMode.Full);
    }

    public void LoadConfigurationFile(string fileName)
    {
        Deserialize(File.ReadAllText(fileName));
    }

    public void Deserialize(string xml)
    {
        using (var sr = new StringReader(xml))
        using (var reader = XmlTextReader.Create(sr))
        {
            base.DeserializeSection(reader);
        }
    }
}

次に、文字列またはファイルから構成をロードできます。

string configString = "<unity xmlns=\"http://schemas.microsoft.com/practices/2010/unity\">\r\n  <container>\r\n    <register type=\"IEmployee\" mapTo=\"FakeEmployee\" />\r\n    </container>\r\n</unity>";

var config = new MyUnityConfigurationSection();
config.Deserialize(configString);

IUnityContainer container = new UnityContainer();
container.LoadConfiguration(config);

構成アセンブリでメソッドを作成することをお勧めします。

public void Configure(IUnityContainer container)
{
    // internally configure the container via XML or programmatically
}
于 2012-12-30T06:28:02.123 に答える