0

コントロールコンテナの独自の反転を構築しようとしています。現在、オブジェクトとそのタイプをディクショナリに保存し、要求されたときに参照を解決しています。しかし、参照または新しいインスタンスを解決できるようにしたいと考えています。Activator クラスを使用して新しいインスタンスを作成できます。しかし、解決するオブジェクトのコンストラクターが 1 つ、2 つ、または任意のパラメーターを取る場合はどうなるでしょうか。

たとえば、次のようなことが言えるようになりたいです。

Container.register<IFoo>(new Foo(Proxy));
Container.register<IBar>(new Boo(Proxy, DataThing));

そしてそれを次のように解決します

IFoo MyFoo = Resolver.resolve<IFoo>();
IBar MyBar = Resolver.resolve<IBar>();

MyFoo は指定されたパラメータProxyでインスタンス化され、 MyBar はProxyDataThingでインスタンス化されます。

それを実現するために解決は何をしなければなりませんか?

4

3 に答える 3

2

チェックアウトhttp://funq.codeplex.com。これは、ラムダ式を使用して解決する関数を定義する非常に小さなコンテナーです。複数のパラメーターを処理します。

于 2009-03-07T02:26:27.803 に答える
1

メソッドに分割することにしました。コンテナに格納されているインスタンスを返す Resolve。そして、新しいインスタンスをインスタンス化する Create 。

何かのようなもの:

 public T Create<T>()
         {
             if (registeredTypes.ContainsKey(typeof(T)))
                 return (T)Activator.CreateInstance(registeredTypes[typeof(T)].
                                                                       GetType());
             else
                 throw new DependencyResolverException("Can't
                                       create type. Type " + typeof(T) + "
                                                           not found.");
         }
于 2009-01-27T09:18:40.367 に答える
0

Activator は、パラメーターを持つコンストラクターを持つクラスのインスタンスを作成できます。

CreateInstanceメソッドのこのオーバーロードを見てください。

カスタムバインダーを提供して、一致するコンストラクターを手動で検索できます。

あなたの場合、resolveメソッドは登録されたクラスのインスタンスへの参照を返す必要があります(例では new Boo(Proxy, DataThing) )

于 2009-01-21T14:11:45.093 に答える