17

次の役に立たないプログラムを見てください。

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer unityContainer = new UnityContainer();
        IWindsorContainer windsorContainer = new WindsorContainer();

        Program unityProgram = unityContainer.Resolve<Program>();
        Program castleProgram = windsorContainer.Resolve<Program>();
    }
}

UnityContainer は Program のインスタンスを返しますが、Windsor コンテナーは ComponentNotFoundException をスローします。

両方の動作の引数を確認でき、最終的にどちらになるかは気にしませんが、Prism V2 Drop 8 (執筆時点で最新のもの) は内部的に Unity の動作に依存しており、登録されていないクラスを要求します。

これらすべてのクラスを Prism 用に見つけて登録するよりも、Windsor を Unity のように動作させたいと思います。これを行うのに役立つものはグーグルで見つけられませんでした(私の用語は間違っているかもしれませんが)、ウィンザーのドキュメントはかなり悪いです...

誰でもこの問題の解決策を提案できますか?

4

3 に答える 3

9

Windsor は現在、これをサポートしていません。これは仕様によるものです。その理由は、誤って構成されたオブジェクトを取得しないように、必要なタイプを明示的に登録する必要があるためです。

ただし、近い将来、登録されていない型を作成するためのフックが追加される可能性があります。これは、WCF 統合機能で必要になるためです。(編集-v2.1で追加されましたILazyComponentLoader-sを見てください)

とにかく、怠惰なコンポーネント ローダーに関係なく、流暢な API を使用して、事前に必要な基準に一致するアセンブリからすべての型をバッチ登録することをお勧めします。コードはそれほど多くなく、夜はぐっすり眠れます。

遅延ローダーは、必要なコンポーネントを判断するのに十分な情報が起動時に (コンポジション ルートに)ない場合にのみ使用してください。

于 2009-01-31T22:10:40.613 に答える
6

Windsor はそのままではサポートしていませんが、これを行うための拡張メソッドを作成できます。

static class WindsorExtensions
{
    public static object ResolveType(this IWindsorContainer container, Type type)
    {
        if ( type.IsClass && !container.Kernel.HasComponent(type) )
            container.Kernel.AddComponent(type.FullName, type, LifestyleType.Transient);
        return container.Resolve(type);
     }

     public static T ResolveType<T>(this IWindsorContainer container)
     { return (T)ResolveType(container, typeof(T)); }
}

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer unityContainer = new UnityContainer();
        IWindsorContainer windsorContainer = new WindsorContainer();

        Program unityProgram = unityContainer.Resolve<Program>();
        Program castleProgram = windsorContainer.ResolveType<Program>();
    }
}
于 2009-02-24T15:49:39.617 に答える
2

Krzysztof は、ここで自分のブログにリンクすることを恐れないでください :) http://devlicious.com/blogs/krzysztof_kozmic/archive/2009/11/16/castle-windsor-lazy-loading.aspx

また、この単純な実装が私の WPF アプリで役立つことがわかりました。文字列制約を削除すると、一般的なケースに近くなります。

public class ViewModelLoader : Castle.MicroKernel.Resolvers.ILazyComponentLoader {
    public IRegistration Load(string key, Type service)
    {
        if (service == null)
            return null;
        if (service.Name.EndsWith("ViewModel", StringComparison.CurrentCultureIgnoreCase))
            return Component.For(service).Named(key);
        else
            return null;
    }
}
于 2010-10-11T15:52:25.283 に答える